diff --git a/build_debian.sh b/build_debian.sh
index 2b2294194d7..ed5d180859f 100755
--- a/build_debian.sh
+++ b/build_debian.sh
@@ -225,7 +225,8 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in
gdisk \
sysfsutils \
grub2-common \
- ethtool
+ ethtool \
+ screen
sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y download \
grub-pc-bin
diff --git a/device/accton/x86_64-accton_as7116_54x-r0/Accton-AS7116-54X/buffers.json.j2 b/device/accton/x86_64-accton_as7116_54x-r0/Accton-AS7116-54X/buffers.json.j2
new file mode 100644
index 00000000000..9e26dfeeb6e
--- /dev/null
+++ b/device/accton/x86_64-accton_as7116_54x-r0/Accton-AS7116-54X/buffers.json.j2
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/device/accton/x86_64-accton_as7116_54x-r0/Accton-AS7116-54X/qos.json b/device/accton/x86_64-accton_as7116_54x-r0/Accton-AS7116-54X/qos.json
new file mode 100644
index 00000000000..6f3f6990d87
--- /dev/null
+++ b/device/accton/x86_64-accton_as7116_54x-r0/Accton-AS7116-54X/qos.json
@@ -0,0 +1,153 @@
+{
+ "TC_TO_PRIORITY_GROUP_MAP": {
+ "AZURE": {
+ "0": "1",
+ "1": "0",
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "MAP_PFC_PRIORITY_TO_QUEUE": {
+ "AZURE": {
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "TC_TO_QUEUE_MAP": {
+ "AZURE": {
+ "0": "1",
+ "1": "0",
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "DSCP_TO_TC_MAP": {
+ "AZURE": {
+ "0":"1",
+ "1":"0",
+ "2":"0",
+ "3":"3",
+ "4":"4",
+ "5":"0",
+ "6":"0",
+ "7":"0",
+ "8":"1",
+ "9":"0",
+ "10":"0",
+ "11":"0",
+ "12":"0",
+ "13":"0",
+ "14":"0",
+ "15":"0",
+ "16":"0",
+ "17":"0",
+ "18":"0",
+ "19":"0",
+ "20":"0",
+ "21":"0",
+ "22":"0",
+ "23":"0",
+ "24":"0",
+ "25":"0",
+ "26":"0",
+ "27":"0",
+ "28":"0",
+ "29":"0",
+ "30":"0",
+ "31":"0",
+ "32":"0",
+ "33":"0",
+ "34":"0",
+ "35":"0",
+ "36":"0",
+ "37":"0",
+ "38":"0",
+ "39":"0",
+ "40":"0",
+ "41":"0",
+ "42":"0",
+ "43":"0",
+ "44":"0",
+ "45":"0",
+ "46":"0",
+ "47":"0",
+ "48":"0",
+ "49":"0",
+ "50":"0",
+ "51":"0",
+ "52":"0",
+ "53":"0",
+ "54":"0",
+ "55":"0",
+ "56":"0",
+ "57":"0",
+ "58":"0",
+ "59":"0",
+ "60":"0",
+ "61":"0",
+ "62":"0",
+ "63":"0"
+ }
+ },
+ "SCHEDULER": {
+ "scheduler.0" : {
+ "type":"DWRR",
+ "weight": "25"
+ },
+ "scheduler.1" : {
+ "type":"DWRR",
+ "weight": "30"
+ },
+ "scheduler.2" : {
+ "type":"DWRR",
+ "weight": "20"
+ }
+ },
+ "PORT_QOS_MAP": {
+ "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet5,Ethernet6,Ethernet7,Ethernet8,Ethernet9,Ethernet10,Ethernet11,Ethernet12,Ethernet13,Ethernet14,Ethernet15,Ethernet16,Ethernet17,Ethernet18,Ethernet19,Ethernet20,Ethernet21,Ethernet22,Ethernet23,Ethernet24,Ethernet25,Ethernet26,Ethernet27,Ethernet28,Ethernet29,Ethernet30,Ethernet31,Ethernet32,Ethernet33,Ethernet34,Ethernet35,Ethernet36,Ethernet37,Ethernet38,Ethernet39,Ethernet40,Ethernet41,Ethernet42,Ethernet43,Ethernet44,Ethernet45,Ethernet46,Ethernet47,Ethernet48,Ethernet49,Ethernet50,Ethernet51,Ethernet52,Ethernet53": {
+ "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]",
+ "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]",
+ "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]",
+ "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]",
+ "pfc_enable": "3,4"
+ }
+ },
+ "WRED_PROFILE": {
+ "AZURE_LOSSY" : {
+ "wred_green_enable":"true",
+ "wred_yellow_enable":"true",
+ "wred_red_enable":"true",
+ "ecn":"ecn_all",
+ "red_max_threshold":"516096",
+ "red_min_threshold":"516096",
+ "yellow_max_threshold":"516096",
+ "yellow_min_threshold":"516096",
+ "green_max_threshold": "184128",
+ "green_min_threshold": "184128"
+ },
+ "AZURE_LOSSLESS" : {
+ "wred_green_enable":"true",
+ "wred_yellow_enable":"true",
+ "wred_red_enable":"true",
+ "ecn":"ecn_all",
+ "red_max_threshold":"516096",
+ "red_min_threshold":"516096",
+ "yellow_max_threshold":"516096",
+ "yellow_min_threshold":"516096",
+ "green_max_threshold": "184128",
+ "green_min_threshold": "184128"
+ }
+ },
+ "QUEUE": {
+ "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet5,Ethernet6,Ethernet7,Ethernet8,Ethernet9,Ethernet10,Ethernet11,Ethernet12,Ethernet13,Ethernet14,Ethernet15,Ethernet16,Ethernet17,Ethernet18,Ethernet19,Ethernet20,Ethernet21,Ethernet22,Ethernet23,Ethernet24,Ethernet25,Ethernet26,Ethernet27,Ethernet28,Ethernet29,Ethernet30,Ethernet31,Ethernet32,Ethernet33,Ethernet34,Ethernet35,Ethernet36,Ethernet37,Ethernet38,Ethernet39,Ethernet40,Ethernet41,Ethernet42,Ethernet43,Ethernet44,Ethernet45,Ethernet46,Ethernet47,Ethernet48,Ethernet49,Ethernet50,Ethernet51,Ethernet52,Ethernet53|3-4" : {
+ "scheduler" : "[SCHEDULER|scheduler.0]",
+ "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]"
+ },
+ "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet5,Ethernet6,Ethernet7,Ethernet8,Ethernet9,Ethernet10,Ethernet11,Ethernet12,Ethernet13,Ethernet14,Ethernet15,Ethernet16,Ethernet17,Ethernet18,Ethernet19,Ethernet20,Ethernet21,Ethernet22,Ethernet23,Ethernet24,Ethernet25,Ethernet26,Ethernet27,Ethernet28,Ethernet29,Ethernet30,Ethernet31,Ethernet32,Ethernet33,Ethernet34,Ethernet35,Ethernet36,Ethernet37,Ethernet38,Ethernet39,Ethernet40,Ethernet41,Ethernet42,Ethernet43,Ethernet44,Ethernet45,Ethernet46,Ethernet47,Ethernet48,Ethernet49,Ethernet50,Ethernet51,Ethernet52,Ethernet53|0" : {
+ "scheduler" : "[SCHEDULER|scheduler.1]"
+ },
+ "Ethernet0,Ethernet1,Ethernet2,Ethernet3,Ethernet4,Ethernet5,Ethernet6,Ethernet7,Ethernet8,Ethernet9,Ethernet10,Ethernet11,Ethernet12,Ethernet13,Ethernet14,Ethernet15,Ethernet16,Ethernet17,Ethernet18,Ethernet19,Ethernet20,Ethernet21,Ethernet22,Ethernet23,Ethernet24,Ethernet25,Ethernet26,Ethernet27,Ethernet28,Ethernet29,Ethernet30,Ethernet31,Ethernet32,Ethernet33,Ethernet34,Ethernet35,Ethernet36,Ethernet37,Ethernet38,Ethernet39,Ethernet40,Ethernet41,Ethernet42,Ethernet43,Ethernet44,Ethernet45,Ethernet46,Ethernet47,Ethernet48,Ethernet49,Ethernet50,Ethernet51,Ethernet52,Ethernet53|1" : {
+ "scheduler" : "[SCHEDULER|scheduler.2]"
+ }
+ }
+}
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/buffers.json.j2 b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/buffers.json.j2
new file mode 100644
index 00000000000..9e26dfeeb6e
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/buffers.json.j2
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/qos.json b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/qos.json
new file mode 100644
index 00000000000..62464d7d39f
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9130_32x-r0/INGRASYS-S9130-32X/qos.json
@@ -0,0 +1,153 @@
+{
+ "TC_TO_PRIORITY_GROUP_MAP": {
+ "AZURE": {
+ "0": "1",
+ "1": "0",
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "MAP_PFC_PRIORITY_TO_QUEUE": {
+ "AZURE": {
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "TC_TO_QUEUE_MAP": {
+ "AZURE": {
+ "0": "1",
+ "1": "0",
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "DSCP_TO_TC_MAP": {
+ "AZURE": {
+ "0":"1",
+ "1":"0",
+ "2":"0",
+ "3":"3",
+ "4":"4",
+ "5":"0",
+ "6":"0",
+ "7":"0",
+ "8":"1",
+ "9":"0",
+ "10":"0",
+ "11":"0",
+ "12":"0",
+ "13":"0",
+ "14":"0",
+ "15":"0",
+ "16":"0",
+ "17":"0",
+ "18":"0",
+ "19":"0",
+ "20":"0",
+ "21":"0",
+ "22":"0",
+ "23":"0",
+ "24":"0",
+ "25":"0",
+ "26":"0",
+ "27":"0",
+ "28":"0",
+ "29":"0",
+ "30":"0",
+ "31":"0",
+ "32":"0",
+ "33":"0",
+ "34":"0",
+ "35":"0",
+ "36":"0",
+ "37":"0",
+ "38":"0",
+ "39":"0",
+ "40":"0",
+ "41":"0",
+ "42":"0",
+ "43":"0",
+ "44":"0",
+ "45":"0",
+ "46":"0",
+ "47":"0",
+ "48":"0",
+ "49":"0",
+ "50":"0",
+ "51":"0",
+ "52":"0",
+ "53":"0",
+ "54":"0",
+ "55":"0",
+ "56":"0",
+ "57":"0",
+ "58":"0",
+ "59":"0",
+ "60":"0",
+ "61":"0",
+ "62":"0",
+ "63":"0"
+ }
+ },
+ "SCHEDULER": {
+ "scheduler.0" : {
+ "type":"DWRR",
+ "weight": "25"
+ },
+ "scheduler.1" : {
+ "type":"DWRR",
+ "weight": "30"
+ },
+ "scheduler.2" : {
+ "type":"DWRR",
+ "weight": "20"
+ }
+ },
+ "PORT_QOS_MAP": {
+ "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124": {
+ "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]",
+ "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]",
+ "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]",
+ "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]",
+ "pfc_enable": "3,4"
+ }
+ },
+ "WRED_PROFILE": {
+ "AZURE_LOSSY" : {
+ "wred_green_enable":"true",
+ "wred_yellow_enable":"true",
+ "wred_red_enable":"true",
+ "ecn":"ecn_all",
+ "red_max_threshold":"516096",
+ "red_min_threshold":"516096",
+ "yellow_max_threshold":"516096",
+ "yellow_min_threshold":"516096",
+ "green_max_threshold": "184128",
+ "green_min_threshold": "184128"
+ },
+ "AZURE_LOSSLESS" : {
+ "wred_green_enable":"true",
+ "wred_yellow_enable":"true",
+ "wred_red_enable":"true",
+ "ecn":"ecn_all",
+ "red_max_threshold":"516096",
+ "red_min_threshold":"516096",
+ "yellow_max_threshold":"516096",
+ "yellow_min_threshold":"516096",
+ "green_max_threshold": "184128",
+ "green_min_threshold": "184128"
+ }
+ },
+ "QUEUE": {
+ "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|3-4" : {
+ "scheduler" : "[SCHEDULER|scheduler.0]",
+ "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]"
+ },
+ "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|0" : {
+ "scheduler" : "[SCHEDULER|scheduler.1]"
+ },
+ "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124|1" : {
+ "scheduler" : "[SCHEDULER|scheduler.2]"
+ }
+ }
+}
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/buffers.json.j2 b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/buffers.json.j2
new file mode 100644
index 00000000000..9e26dfeeb6e
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/buffers.json.j2
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/qos.json b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/qos.json
new file mode 100644
index 00000000000..434226afca7
--- /dev/null
+++ b/device/ingrasys/x86_64-ingrasys_s9230_64x-r0/INGRASYS-S9230-64X/qos.json
@@ -0,0 +1,153 @@
+{
+ "TC_TO_PRIORITY_GROUP_MAP": {
+ "AZURE": {
+ "0": "1",
+ "1": "0",
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "MAP_PFC_PRIORITY_TO_QUEUE": {
+ "AZURE": {
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "TC_TO_QUEUE_MAP": {
+ "AZURE": {
+ "0": "1",
+ "1": "0",
+ "3": "3",
+ "4": "4"
+ }
+ },
+ "DSCP_TO_TC_MAP": {
+ "AZURE": {
+ "0":"1",
+ "1":"0",
+ "2":"0",
+ "3":"3",
+ "4":"4",
+ "5":"0",
+ "6":"0",
+ "7":"0",
+ "8":"1",
+ "9":"0",
+ "10":"0",
+ "11":"0",
+ "12":"0",
+ "13":"0",
+ "14":"0",
+ "15":"0",
+ "16":"0",
+ "17":"0",
+ "18":"0",
+ "19":"0",
+ "20":"0",
+ "21":"0",
+ "22":"0",
+ "23":"0",
+ "24":"0",
+ "25":"0",
+ "26":"0",
+ "27":"0",
+ "28":"0",
+ "29":"0",
+ "30":"0",
+ "31":"0",
+ "32":"0",
+ "33":"0",
+ "34":"0",
+ "35":"0",
+ "36":"0",
+ "37":"0",
+ "38":"0",
+ "39":"0",
+ "40":"0",
+ "41":"0",
+ "42":"0",
+ "43":"0",
+ "44":"0",
+ "45":"0",
+ "46":"0",
+ "47":"0",
+ "48":"0",
+ "49":"0",
+ "50":"0",
+ "51":"0",
+ "52":"0",
+ "53":"0",
+ "54":"0",
+ "55":"0",
+ "56":"0",
+ "57":"0",
+ "58":"0",
+ "59":"0",
+ "60":"0",
+ "61":"0",
+ "62":"0",
+ "63":"0"
+ }
+ },
+ "SCHEDULER": {
+ "scheduler.0" : {
+ "type":"DWRR",
+ "weight": "25"
+ },
+ "scheduler.1" : {
+ "type":"DWRR",
+ "weight": "30"
+ },
+ "scheduler.2" : {
+ "type":"DWRR",
+ "weight": "20"
+ }
+ },
+ "PORT_QOS_MAP": {
+ "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124,Ethernet128,Ethernet132,Ethernet136,Ethernet140,Ethernet144,Ethernet148,Ethernet152,Ethernet156,Ethernet160,Ethernet164,Ethernet168,Ethernet172,Ethernet176,Ethernet180,Ethernet184,Ethernet188,Ethernet192,Ethernet196,Ethernet200,Ethernet204,Ethernet208,Ethernet212,Ethernet216,Ethernet220,Ethernet224,Ethernet228,Ethernet232,Ethernet236,Ethernet240,Ethernet244,Ethernet248,Ethernet252": {
+ "dscp_to_tc_map" : "[DSCP_TO_TC_MAP|AZURE]",
+ "tc_to_queue_map" : "[TC_TO_QUEUE_MAP|AZURE]",
+ "tc_to_pg_map" : "[TC_TO_PRIORITY_GROUP_MAP|AZURE]",
+ "pfc_to_queue_map": "[MAP_PFC_PRIORITY_TO_QUEUE|AZURE]",
+ "pfc_enable": "3,4"
+ }
+ },
+ "WRED_PROFILE": {
+ "AZURE_LOSSY" : {
+ "wred_green_enable":"true",
+ "wred_yellow_enable":"true",
+ "wred_red_enable":"true",
+ "ecn":"ecn_all",
+ "red_max_threshold":"516096",
+ "red_min_threshold":"516096",
+ "yellow_max_threshold":"516096",
+ "yellow_min_threshold":"516096",
+ "green_max_threshold": "184128",
+ "green_min_threshold": "184128"
+ },
+ "AZURE_LOSSLESS" : {
+ "wred_green_enable":"true",
+ "wred_yellow_enable":"true",
+ "wred_red_enable":"true",
+ "ecn":"ecn_all",
+ "red_max_threshold":"516096",
+ "red_min_threshold":"516096",
+ "yellow_max_threshold":"516096",
+ "yellow_min_threshold":"516096",
+ "green_max_threshold": "184128",
+ "green_min_threshold": "184128"
+ }
+ },
+ "QUEUE": {
+ "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124,Ethernet128,Ethernet132,Ethernet136,Ethernet140,Ethernet144,Ethernet148,Ethernet152,Ethernet156,Ethernet160,Ethernet164,Ethernet168,Ethernet172,Ethernet176,Ethernet180,Ethernet184,Ethernet188,Ethernet192,Ethernet196,Ethernet200,Ethernet204,Ethernet208,Ethernet212,Ethernet216,Ethernet220,Ethernet224,Ethernet228,Ethernet232,Ethernet236,Ethernet240,Ethernet244,Ethernet248,Ethernet252|3-4" : {
+ "scheduler" : "[SCHEDULER|scheduler.0]",
+ "wred_profile" : "[WRED_PROFILE|AZURE_LOSSY]"
+ },
+ "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124,Ethernet128,Ethernet132,Ethernet136,Ethernet140,Ethernet144,Ethernet148,Ethernet152,Ethernet156,Ethernet160,Ethernet164,Ethernet168,Ethernet172,Ethernet176,Ethernet180,Ethernet184,Ethernet188,Ethernet192,Ethernet196,Ethernet200,Ethernet204,Ethernet208,Ethernet212,Ethernet216,Ethernet220,Ethernet224,Ethernet228,Ethernet232,Ethernet236,Ethernet240,Ethernet244,Ethernet248,Ethernet252|0" : {
+ "scheduler" : "[SCHEDULER|scheduler.1]"
+ },
+ "Ethernet0,Ethernet4,Ethernet8,Ethernet12,Ethernet16,Ethernet20,Ethernet24,Ethernet28,Ethernet32,Ethernet36,Ethernet40,Ethernet44,Ethernet48,Ethernet52,Ethernet56,Ethernet60,Ethernet64,Ethernet68,Ethernet72,Ethernet76,Ethernet80,Ethernet84,Ethernet88,Ethernet92,Ethernet96,Ethernet100,Ethernet104,Ethernet108,Ethernet112,Ethernet116,Ethernet120,Ethernet124,Ethernet128,Ethernet132,Ethernet136,Ethernet140,Ethernet144,Ethernet148,Ethernet152,Ethernet156,Ethernet160,Ethernet164,Ethernet168,Ethernet172,Ethernet176,Ethernet180,Ethernet184,Ethernet188,Ethernet192,Ethernet196,Ethernet200,Ethernet204,Ethernet208,Ethernet212,Ethernet216,Ethernet220,Ethernet224,Ethernet228,Ethernet232,Ethernet236,Ethernet240,Ethernet244,Ethernet248,Ethernet252|1" : {
+ "scheduler" : "[SCHEDULER|scheduler.2]"
+ }
+ }
+}
diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2
index ff52cf88e7d..db693540fb3 100644
--- a/dockers/docker-base/Dockerfile.j2
+++ b/dockers/docker-base/Dockerfile.j2
@@ -18,8 +18,9 @@ RUN rm -rf \
ENV DEBIAN_FRONTEND=noninteractive
# Configure data sources for apt/dpkg
-COPY ["sources.list", "/etc/apt/sources.list"]
COPY ["dpkg_01_drop", "/etc/dpkg/dpkg.cfg.d/01_drop"]
+COPY ["sources.list", "/etc/apt/sources.list"]
+COPY ["no_install_recommend_suggest", "/etc/apt/apt.conf.d"]
RUN apt-get update
# Pre-install fundamental packages
diff --git a/dockers/docker-base/no_install_recommend_suggest b/dockers/docker-base/no_install_recommend_suggest
new file mode 100644
index 00000000000..b5bca577de1
--- /dev/null
+++ b/dockers/docker-base/no_install_recommend_suggest
@@ -0,0 +1,5 @@
+# Instruct apt-get to NOT install "recommended" or "suggested" packages by
+# default when installing a package.
+
+APT::Install-Recommends "false";
+APT::Install-Suggests "false";
diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2
index 7fb3401184f..4690e1587c1 100644
--- a/dockers/docker-database/Dockerfile.j2
+++ b/dockers/docker-database/Dockerfile.j2
@@ -1,34 +1,34 @@
FROM docker-config-engine
-## Make apt-get non-interactive
+# Make apt-get non-interactive
ENV DEBIAN_FRONTEND=noninteractive
+# Update apt's cache of available packages
RUN apt-get update
-COPY \
-{% for deb in docker_database_debs.split(' ') -%}
-debs/{{ deb }}{{' '}}
-{%- endfor -%}
-debs/
-
-## Install redis-tools dependencies
-## TODO: implicitly install dependencies
-RUN apt-get -y install libjemalloc1
-
-RUN dpkg -i \
-{% for deb in docker_database_debs.split(' ') -%}
-debs/{{ deb }}{{' '}}
+{% if docker_database_debs.strip() -%}
+# Copy locally-built Debian package dependencies
+{%- for deb in docker_database_debs.split(' ') %}
+COPY debs/{{ deb }} /debs/
{%- endfor %}
-## Clean up
-RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
-RUN rm -rf /debs
-
-RUN sed -ri 's/^(save .*$)/# \1/g; \
- s/^daemonize yes$/daemonize no/; \
- s/^logfile .*$/logfile ""/; \
- s/^# syslog-enabled no$/syslog-enabled no/; \
- s/^# unixsocket/unixsocket/; \
+# Install locally-built Debian packages and implicitly install their dependencies
+{%- for deb in docker_database_debs.split(' ') %}
+RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /debs/{{ deb }}
+{%- endfor %}
+{%- endif %}
+
+# Clean up
+RUN apt-get clean -y
+RUN apt-get autoclean -y
+RUN apt-get autoremove -y
+RUN rm -rf /debs ~/.cache
+
+RUN sed -ri 's/^(save .*$)/# \1/g; \
+ s/^daemonize yes$/daemonize no/; \
+ s/^logfile .*$/logfile ""/; \
+ s/^# syslog-enabled no$/syslog-enabled no/; \
+ s/^# unixsocket/unixsocket/; \
s/^client-output-buffer-limit pubsub [0-9]+mb [0-9]+mb [0-9]+/client-output-buffer-limit pubsub 0 0 0/ \
' /etc/redis/redis.conf
diff --git a/dockers/docker-fpm-quagga/Dockerfile.j2 b/dockers/docker-fpm-quagga/Dockerfile.j2
index c10cf0fd71d..8836459e4e9 100644
--- a/dockers/docker-fpm-quagga/Dockerfile.j2
+++ b/dockers/docker-fpm-quagga/Dockerfile.j2
@@ -1,26 +1,31 @@
FROM docker-config-engine
-## Make apt-get non-interactive
+# Make apt-get non-interactive
ENV DEBIAN_FRONTEND=noninteractive
+# Update apt's cache of available packages
RUN apt-get update
-RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4
+# Install required packages
+RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4
-COPY \
-{% for deb in docker_fpm_quagga_debs.split(' ') -%}
-debs/{{ deb }}{{' '}}
-{%- endfor -%}
-debs/
+{% if docker_fpm_quagga_debs.strip() -%}
+# Copy locally-built Debian package dependencies
+{%- for deb in docker_fpm_quagga_debs.split(' ') %}
+COPY debs/{{ deb }} /debs/
+{%- endfor %}
-RUN dpkg -i \
-{% for deb in docker_fpm_quagga_debs.split(' ') -%}
-debs/{{ deb }}{{' '}}
+# Install locally-built Debian packages and implicitly install their dependencies
+{%- for deb in docker_fpm_quagga_debs.split(' ') %}
+RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /debs/{{ deb }}
{%- endfor %}
+{%- endif %}
-## Clean up
-RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
-RUN rm -rf /debs
+# Clean up
+RUN apt-get clean -y
+RUN apt-get autoclean -y
+RUN apt-get autoremove -y
+RUN rm -rf /debs ~/.cache
COPY ["bgpcfgd", "start.sh", "/usr/bin/"]
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2
index bd8de7e4ba1..1adb660ec00 100644
--- a/dockers/docker-fpm-quagga/bgpd.conf.j2
+++ b/dockers/docker-fpm-quagga/bgpd.conf.j2
@@ -64,6 +64,11 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
{% if bgp_session['asn'] | int != 0 %}
neighbor {{ neighbor_addr }} remote-as {{ bgp_session['asn'] }}
neighbor {{ neighbor_addr }} description {{ bgp_session['name'] }}
+{# set the bgp neighbor timers if they have not default values #}
+{% if (bgp_session['keepalive'] is defined and bgp_session['keepalive'] | int != 60)
+ or (bgp_session['holdtime'] is defined and bgp_session['holdtime'] | int != 180) %}
+ neighbor {{ neighbor_addr }} timers {{ bgp_session['keepalive'] }} {{ bgp_session['holdtime'] }}
+{% endif %}
{% if bgp_session.has_key('admin_status') and bgp_session['admin_status'] == 'down' or not bgp_session.has_key('admin_status') and DEVICE_METADATA['localhost'].has_key('default_bgp_status') and DEVICE_METADATA['localhost']['default_bgp_status'] == 'down' %}
neighbor {{ neighbor_addr }} shutdown
{% endif %}
diff --git a/dockers/docker-fpm-quagga/zebra.conf.j2 b/dockers/docker-fpm-quagga/zebra.conf.j2
index 8b967f98671..e4586e72dd6 100644
--- a/dockers/docker-fpm-quagga/zebra.conf.j2
+++ b/dockers/docker-fpm-quagga/zebra.conf.j2
@@ -40,11 +40,13 @@ ip route 0.0.0.0/0 {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} 200
{% set lo_ipv6_addrs = [] %}
{% if LOOPBACK_INTERFACE %}
{% for (name, prefix) in LOOPBACK_INTERFACE %}
-{% if prefix | ipv6 %}
-{% if lo_ipv6_addrs.append(prefix) %}
-{% endif %}
-{% else %}
-{% if lo_ipv4_addrs.append(prefix) %}
+{% if name == 'Loopback0' %}
+{% if prefix | ipv6 %}
+{% if lo_ipv6_addrs.append(prefix) %}
+{% endif %}
+{% else %}
+{% if lo_ipv4_addrs.append(prefix) %}
+{% endif %}
{% endif %}
{% endif %}
{% endfor %}
diff --git a/dockers/docker-lldp-sv2/lldpd.conf.j2 b/dockers/docker-lldp-sv2/lldpd.conf.j2
index ea8be54b097..94a04596699 100644
--- a/dockers/docker-lldp-sv2/lldpd.conf.j2
+++ b/dockers/docker-lldp-sv2/lldpd.conf.j2
@@ -1,6 +1,3 @@
{% if MGMT_INTERFACE %}
configure ports eth0 lldp portidsubtype local {{ MGMT_INTERFACE.keys()[0][0] }}
{% endif %}
-{% for local_port in DEVICE_NEIGHBOR %}
-configure ports {{ local_port }} lldp portidsubtype local {{ PORT[local_port]['alias'] }} description {{ DEVICE_NEIGHBOR[local_port]['name'] }}:{{ DEVICE_NEIGHBOR[local_port]['port'] }}
-{% endfor %}
diff --git a/dockers/docker-lldp-sv2/lldpmgrd b/dockers/docker-lldp-sv2/lldpmgrd
index 89bba918bf3..a044d5ed9d7 100755
--- a/dockers/docker-lldp-sv2/lldpmgrd
+++ b/dockers/docker-lldp-sv2/lldpmgrd
@@ -20,6 +20,7 @@ try:
import subprocess
import sys
import syslog
+ import os.path
from swsscommon import swsscommon
except ImportError as err:
raise ImportError("%s - required module not found" % str(err))
@@ -70,6 +71,19 @@ def signal_handler(sig, frame):
else:
log_warning("Caught unhandled signal '" + sig + "'")
+# ========================== Helpers ==================================
+
+def is_port_up(port_name):
+ filename = "/sys/class/net/%s/operstate" % port_name
+ if not os.path.exists(filename):
+ return False
+
+ with open(filename) as fp:
+ state = fp.read()
+ if 'up' in state:
+ return True
+ else:
+ return False
# ============================== Classes ==============================
@@ -159,6 +173,11 @@ class LldpManager(object):
to_delete = []
for (port_name, cmd) in self.pending_cmds.iteritems():
+ if not is_port_up(port_name):
+ # it doesn't make any sense to configure lldpd if the target port is unavailable
+ # let's postpone the command for the next iteration
+ continue
+
log_debug("Running command: '{}'".format(cmd))
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
diff --git a/dockers/docker-lldp-sv2/start.sh b/dockers/docker-lldp-sv2/start.sh
index 26337fb0667..adc32297981 100755
--- a/dockers/docker-lldp-sv2/start.sh
+++ b/dockers/docker-lldp-sv2/start.sh
@@ -6,8 +6,32 @@ mkdir -p /var/sonic
echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status
rm -f /var/run/rsyslogd.pid
+rm -f /var/run/lldpd.socket
supervisorctl start rsyslogd
supervisorctl start lldpd
supervisorctl start lldp-syncd
supervisorctl start lldpmgrd
+
+# Current lldpd version has a bug.
+# When lldpd starts it is in the pause state by default
+# But then it execute 'lldpcli resume' to configure and unpause itself.
+# When lldpd execute lldpcli, it doesn't check the return code
+# Sometimes lldpcli returns failure, but lldpd doesn't catch it
+# and keeps working paused and unconfigured
+#
+# The fix below addresses the issue.
+#
+
+# wait until lldpd started
+until [[ -e /var/run/lldpd.socket ]];
+do
+ sleep 1;
+done
+
+# Manually try to resume lldpd, until it's successful
+while /bin/true;
+do
+ lldpcli -u /var/run/lldpd.socket -c /etc/lldpd.conf -c /etc/lldpd.d resume > /dev/null && break
+ sleep 1
+done
diff --git a/dockers/docker-orchagent/ipinip.json.j2 b/dockers/docker-orchagent/ipinip.json.j2
index bee97f45b8a..36fccddc237 100644
--- a/dockers/docker-orchagent/ipinip.json.j2
+++ b/dockers/docker-orchagent/ipinip.json.j2
@@ -1,7 +1,7 @@
{# only IPv4 decapsulation is supported #}
{% set ipv4_loopback_addresses = [] %}
{% for (name, prefix) in LOOPBACK_INTERFACE %}
- {%- if prefix | ipv4 %}
+ {%- if prefix | ipv4 and name == 'Loopback0' %}
{%- set ipv4_loopback_addresses = ipv4_loopback_addresses.append(prefix) %}
{%- endif %}
{% endfor %}
diff --git a/dockers/docker-orchagent/switch.json.j2 b/dockers/docker-orchagent/switch.json.j2
index 7a8c3522ece..7aaada1b1e4 100644
--- a/dockers/docker-orchagent/switch.json.j2
+++ b/dockers/docker-orchagent/switch.json.j2
@@ -1,10 +1,11 @@
+{# the range of hash_seed is 0-15 #}
{# set default hash seed to 0 #}
{% set hash_seed = 0 %}
{% if DEVICE_METADATA.localhost.type %}
{% if DEVICE_METADATA.localhost.type == "ToRRouter" %}
-{% set hash_seed = 10 %}
+{% set hash_seed = 0 %}
{% elif DEVICE_METADATA.localhost.type == "LeafRouter" %}
-{% set hash_seed = 20 %}
+{% set hash_seed = 10 %}
{% endif %}
{% endif %}
[
diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2
index da46cb9b1cf..2605e9b50c2 100644
--- a/dockers/docker-snmp-sv2/Dockerfile.j2
+++ b/dockers/docker-snmp-sv2/Dockerfile.j2
@@ -1,44 +1,56 @@
FROM docker-config-engine
-COPY [ \
-{% for deb in docker_snmp_sv2_debs.split(' ') -%}
- "debs/{{ deb }}",
-{%- endfor %} \
- "/debs/"]
-
-# Install Python SwSSSDK (SNMP subagent dependency)
-COPY python-wheels/sonic_platform_common-*-py3-*.whl /python-wheels/
-COPY python-wheels/swsssdk-*-py3-*.whl /python-wheels/
-COPY python-wheels/asyncsnmp-*-py3-*.whl /python-wheels/
-
-# enable -O for all Python calls
+# Enable -O for all Python calls
ENV PYTHONOPTIMIZE 1
-## Make apt-get non-interactive
+# Make apt-get non-interactive
ENV DEBIAN_FRONTEND=noninteractive
-# install libsnmp30 dependencies
-# install libpython3.6-dev dependencies
-# install pip dependencies
-# TODO: remove libpython3.6-dev, its and pip's dependencies if we can get pip3 directly
-# install subagent
-# clean up
-RUN apt-get update && apt-get install -y libperl5.20 libpci3 libwrap0 \
- libexpat1-dev \
- curl gcc && \
- dpkg -i \
-{% for deb in docker_snmp_sv2_debs.split(' ') -%}
- debs/{{ deb }}{{' '}}
-{%- endfor %} && \
- rm -rf /debs && \
- curl https://bootstrap.pypa.io/get-pip.py | python3.6 && \
- python3.6 -m pip install --no-cache-dir /python-wheels/*py3*.whl hiredis && \
- rm -rf /python-wheels && \
- python3.6 -m sonic_ax_impl install && \
- apt-get -y purge libpython3.6-dev libexpat1-dev curl gcc && \
- apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y --purge && \
- find / | grep -E "__pycache__" | xargs rm -rf && \
- rm -rf ~/.cache
+# Update apt's cache of available packages
+RUN apt-get update
+
+# Install curl so we can download and install pip later
+# Also install major root CA certificates for curl to reference
+RUN apt-get install -y curl ca-certificates
+
+# Install gcc which is required for installing hiredis
+RUN apt-get install -y gcc
+
+{% if docker_snmp_sv2_debs.strip() -%}
+# Copy locally-built Debian package dependencies
+{%- for deb in docker_snmp_sv2_debs.split(' ') %}
+COPY debs/{{ deb }} /debs/
+{%- endfor %}
+
+# Install locally-built Debian packages and implicitly install their dependencies
+{%- for deb in docker_snmp_sv2_debs.split(' ') %}
+RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /debs/{{ deb }}
+{%- endfor %}
+{%- endif %}
+
+# Install up-to-date version of pip
+RUN curl https://bootstrap.pypa.io/get-pip.py | python3.6
+RUN python3.6 -m pip install --no-cache-dir hiredis
+
+{% if docker_snmp_sv2_whls.strip() -%}
+# Copy locally-built Python wheel dependencies
+{%- for whl in docker_snmp_sv2_whls.split(' ') %}
+COPY python-wheels/{{ whl }} /python-wheels/
+{%- endfor %}
+
+# Install locally-built Python wheel dependencies
+{%- for whl in docker_snmp_sv2_whls.split(' ') %}
+RUN pip install /python-wheels/{{ whl }}
+{%- endfor %}
+{% endif %}
+
+RUN python3.6 -m sonic_ax_impl install
+
+# Clean up
+RUN apt-get -y purge libpython3.6-dev curl gcc
+RUN apt-get clean -y && apt-get autoclean -y && apt-get autoremove -y --purge
+RUN find / | grep -E "__pycache__" | xargs rm -rf
+RUN rm -rf /debs /python-wheels ~/.cache
COPY ["start.sh", "/usr/bin/"]
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
@@ -46,7 +58,7 @@ COPY ["*.j2", "/usr/share/sonic/templates/"]
COPY ["snmpd-config-updater", "/usr/bin/snmpd-config-updater"]
RUN chmod +x /usr/bin/snmpd-config-updater
-## Although exposing ports is not needed for host net mode, keep it for possible bridge mode
+# Although exposing ports is not needed for host net mode, keep it for possible bridge mode
EXPOSE 161/udp 162/udp
ENTRYPOINT ["/usr/bin/supervisord"]
diff --git a/files/image_config/logrotate/logrotate.d/rsyslog b/files/image_config/logrotate/logrotate.d/rsyslog
index ed54c62082f..6788762d768 100644
--- a/files/image_config/logrotate/logrotate.d/rsyslog
+++ b/files/image_config/logrotate/logrotate.d/rsyslog
@@ -57,8 +57,8 @@
VAR_LOG_SIZE_KB=$(df -k /var/log | sed -n 2p | awk '{ print $2 }')
- # Limit usable space to 95% of the partition minus the reserved space for other logs
- USABLE_SPACE_KB=$(( (VAR_LOG_SIZE_KB * 95 / 100) - RESERVED_SPACE_KB))
+ # Limit usable space to 90% of the partition minus the reserved space for other logs
+ USABLE_SPACE_KB=$(( (VAR_LOG_SIZE_KB * 90 / 100) - RESERVED_SPACE_KB))
# Set our threshold so as to maintain enough space to write all logs from empty to full
# Most likely, some logs will have non-zero size when this is called, so this errs on the side
diff --git a/files/image_config/updategraph/updategraph.service b/files/image_config/updategraph/updategraph.service
index 4599f56bdc6..ec478d93a13 100644
--- a/files/image_config/updategraph/updategraph.service
+++ b/files/image_config/updategraph/updategraph.service
@@ -7,6 +7,7 @@ Requires=database.service
[Service]
Type=oneshot
ExecStart=/usr/bin/updategraph
+RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
diff --git a/platform/broadcom/sai.mk b/platform/broadcom/sai.mk
index 5120b1518f6..572ad5271f1 100644
--- a/platform/broadcom/sai.mk
+++ b/platform/broadcom/sai.mk
@@ -1,9 +1,9 @@
-BRCM_SAI = libsaibcm_3.1.3.4-10_amd64.deb
-$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.1.3.4-10_amd64.deb?sv=2015-04-05&sr=b&sig=72n19AElVmbqo3ahrEFVBwMgR%2FoQ7fhUj4tcadx8pVE%3D&se=2031-12-20T20%3A27%3A14Z&sp=r"
+BRCM_SAI = libsaibcm_3.1.3.4-11_amd64.deb
+$(BRCM_SAI)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm_3.1.3.4-11_amd64.deb?sv=2015-04-05&sr=b&sig=0pctCvAKfSqT8O%2FWSMxw532XAXFsxXdKljQqWfOX8xA%3D&se=2155-03-25T07%3A23%3A41Z&sp=r"
-BRCM_SAI_DEV = libsaibcm-dev_3.1.3.4-10_amd64.deb
+BRCM_SAI_DEV = libsaibcm-dev_3.1.3.4-11_amd64.deb
$(eval $(call add_derived_package,$(BRCM_SAI),$(BRCM_SAI_DEV)))
-$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.1.3.4-10_amd64.deb?sv=2015-04-05&sr=b&sig=cN4qsWX8XW04ZObBDonwh5Uzgmp5A0iRBkpZA9N5Zb8%3D&se=2031-12-20T20%3A26%3A45Z&sp=r"
+$(BRCM_SAI_DEV)_URL = "https://sonicstorage.blob.core.windows.net/packages/libsaibcm-dev_3.1.3.4-11_amd64.deb?sv=2015-04-05&sr=b&sig=IO1g%2FdcObkureizN8ZMPqISP6opZXu%2FrHostog6aIrU%3D&se=2155-03-25T08%3A13%3A34Z&sp=r"
SONIC_ONLINE_DEBS += $(BRCM_SAI) $(BRCM_SAI_DEV)
$(BRCM_SAI_DEV)_DEPENDS += $(BRCM_SAI)
diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista
index 86221d907f2..a35c7eddaf9 160000
--- a/platform/broadcom/sonic-platform-modules-arista
+++ b/platform/broadcom/sonic-platform-modules-arista
@@ -1 +1 @@
-Subproject commit 86221d907f27e7f6df40393a5bfe217bf22b19af
+Subproject commit a35c7eddaf945a1ff09ea71b47f69b6ddba5e892
diff --git a/platform/mellanox/mlnx-sai.mk b/platform/mellanox/mlnx-sai.mk
index 23ef8c60458..9432b596428 100644
--- a/platform/mellanox/mlnx-sai.mk
+++ b/platform/mellanox/mlnx-sai.mk
@@ -1,7 +1,7 @@
# Mellanox SAI
-MLNX_SAI_VERSION = SAIRel1.11.4-master
-MLNX_SAI_REVISION = 1a44c29b22e1f36f4856f4aee92ad513c963c2b8
+MLNX_SAI_VERSION = SAIRel1.11.5-master
+MLNX_SAI_REVISION = 15f8f0f0a3d5e33e62a404bae829f1d6b378b0f7
export MLNX_SAI_VERSION MLNX_SAI_REVISION
diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk
index 2ebb7d23f9c..2ae9e43ac52 100644
--- a/platform/mellanox/sdk.mk
+++ b/platform/mellanox/sdk.mk
@@ -1,5 +1,5 @@
-MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/6367854b48b73470a6e093f6fbbd45b3341edaba/sdk
-MLNX_SDK_VERSION = 4.2.7201
+MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/56130a854a3b0f4e46d6d84749a5d758e7d1f297/sdk
+MLNX_SDK_VERSION = 4.2.7303
MLNX_SDK_RDEBS += $(APPLIBS) $(IPROUTE2_MLNX) $(SX_ACL_RM) $(SX_COMPLIB) \
$(SX_EXAMPLES) $(SX_GEN_UTILS) $(SX_SCEW) $(SX_SDN_HAL) \
$(SXD_LIBS) $(TESTX)
diff --git a/platform/nephos/sai.mk b/platform/nephos/sai.mk
index 7c898bbada6..213692d0fe6 100644
--- a/platform/nephos/sai.mk
+++ b/platform/nephos/sai.mk
@@ -1,9 +1,9 @@
-NEPHOS_SAI = libsainps_2.0.4_amd64.deb
-$(NEPHOS_SAI)_URL = "https://github.com/NephosInc/SONiC/raw/master/sai/libsainps_2.0.4_amd64.deb"
+NEPHOS_SAI = libsainps_2.0.3_sai_1.2.4_d15aca_amd64.deb
+$(NEPHOS_SAI)_URL = "https://github.com/NephosInc/SONiC/raw/master/sai/libsainps_2.0.3_sai_1.2.4_d15aca_amd64.deb"
-NEPHOS_SAI_DEV = libsainps-dev_2.0.4_sai_1.2.4_amd64.deb
+NEPHOS_SAI_DEV = libsainps-dev_2.0.3_sai_1.2.4_d15aca_amd64.deb
$(eval $(call add_derived_package,$(NEPHOS_SAI),$(NEPHOS_SAI_DEV)))
-$(NEPHOS_SAI_DEV)_URL = "https://github.com/NephosInc/SONiC/raw/master/sai/libsainps-dev_2.0.4_sai_1.2.4_amd64.deb"
+$(NEPHOS_SAI_DEV)_URL = "https://github.com/NephosInc/SONiC/raw/master/sai/libsainps-dev_2.0.3_sai_1.2.4_d15aca_amd64.deb"
SONIC_ONLINE_DEBS += $(NEPHOS_SAI) $(NEPHOS_SAI_DEV)
$(NEPHOS_SAI_DEV)_DEPENDS += $(NEPHOS_SAI)
diff --git a/platform/nephos/sdk.mk b/platform/nephos/sdk.mk
index 743512366db..92642a19d02 100644
--- a/platform/nephos/sdk.mk
+++ b/platform/nephos/sdk.mk
@@ -1,4 +1,4 @@
-NEPHOS_NPS_KERNEL = nps-modules-3.16.0-5-amd64_2.0.3_amd64.deb
-$(NEPHOS_NPS_KERNEL)_URL = "https://github.com/NephosInc/SONiC/raw/master/sdk/nps-modules-3.16.0-5-amd64_2.0.3_amd64.deb"
+NEPHOS_NPS_KERNEL = nps-modules-3.16.0-5_2.0.3_d15aca_amd64.deb
+$(NEPHOS_NPS_KERNEL)_URL = "https://github.com/NephosInc/SONiC/raw/master/sdk/nps-modules-3.16.0-5_2.0.3_d15aca_amd64.deb"
SONIC_ONLINE_DEBS += $(NEPHOS_NPS_KERNEL)
diff --git a/platform/p4/docker-sonic-p4.mk b/platform/p4/docker-sonic-p4.mk
index 1cd15439fb7..534d161631f 100644
--- a/platform/p4/docker-sonic-p4.mk
+++ b/platform/p4/docker-sonic-p4.mk
@@ -5,8 +5,8 @@ $(DOCKER_SONIC_P4)_PATH = $(PLATFORM_PATH)/docker-sonic-p4
$(DOCKER_SONIC_P4)_DEPENDS += $(SWSS) \
$(SYNCD) \
$(P4_SWITCH) \
- $(REDIS_SERVER) \
$(REDIS_TOOLS) \
+ $(REDIS_SERVER) \
$(PYTHON_SWSSCOMMON) \
$(LIBTEAMDCT) \
$(LIBTEAM_UTILS) \
diff --git a/platform/vs/docker-sonic-vs.mk b/platform/vs/docker-sonic-vs.mk
index 656c5364463..ce0f4f3dea0 100644
--- a/platform/vs/docker-sonic-vs.mk
+++ b/platform/vs/docker-sonic-vs.mk
@@ -4,8 +4,8 @@ DOCKER_SONIC_VS = docker-sonic-vs.gz
$(DOCKER_SONIC_VS)_PATH = $(PLATFORM_PATH)/docker-sonic-vs
$(DOCKER_SONIC_VS)_DEPENDS += $(SWSS) \
$(SYNCD_VS) \
- $(REDIS_SERVER) \
$(REDIS_TOOLS) \
+ $(REDIS_SERVER) \
$(PYTHON_SWSSCOMMON) \
$(LIBTEAMDCT) \
$(LIBTEAM_UTILS) \
diff --git a/platform/vs/docker-sonic-vs/Dockerfile.j2 b/platform/vs/docker-sonic-vs/Dockerfile.j2
index 7599059164c..0c242bb373e 100644
--- a/platform/vs/docker-sonic-vs/Dockerfile.j2
+++ b/platform/vs/docker-sonic-vs/Dockerfile.j2
@@ -43,20 +43,23 @@ RUN apt-get install -y net-tools \
RUN pip install setuptools
RUN pip install py2_ipaddress
-COPY \
-{% for deb in docker_sonic_vs_debs.split(' ') -%}
-debs/{{ deb }}{{' '}}
-{%- endfor -%}
-debs/
+{% if docker_sonic_vs_debs.strip() -%}
+# Copy locally-built Debian package dependencies
+{%- for deb in docker_sonic_vs_debs.split(' ') %}
+COPY debs/{{ deb }} /debs/
+{%- endfor %}
-RUN dpkg -i \
-{% for deb in docker_sonic_vs_debs.split(' ') -%}
-debs/{{ deb }}{{' '}}
+# Install locally-built Debian packages and implicitly install their dependencies
+{%- for deb in docker_sonic_vs_debs.split(' ') %}
+RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /debs/{{ deb }}
{%- endfor %}
+{%- endif %}
-## Clean up
-RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
-RUN rm -rf /debs
+# Clean up
+RUN apt-get clean -y
+RUN apt-get autoclean -y
+RUN apt-get autoremove -y
+RUN rm -rf /debs ~/.cache
RUN sed -ri 's/^(save .*$)/# \1/g; \
s/^daemonize yes$/daemonize no/; \
diff --git a/rules/docker-database.mk b/rules/docker-database.mk
index ef77047e843..7625f8b37ab 100644
--- a/rules/docker-database.mk
+++ b/rules/docker-database.mk
@@ -2,7 +2,7 @@
DOCKER_DATABASE = docker-database.gz
$(DOCKER_DATABASE)_PATH = $(DOCKERS_PATH)/docker-database
-$(DOCKER_DATABASE)_DEPENDS += $(REDIS_SERVER) $(REDIS_TOOLS)
+$(DOCKER_DATABASE)_DEPENDS += $(REDIS_TOOLS) $(REDIS_SERVER)
$(DOCKER_DATABASE)_LOAD_DOCKERS += $(DOCKER_CONFIG_ENGINE)
SONIC_DOCKER_IMAGES += $(DOCKER_DATABASE)
SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_DATABASE)
diff --git a/rules/docker-snmp-sv2.mk b/rules/docker-snmp-sv2.mk
index dc5bc1cc702..f0e354b9ed5 100644
--- a/rules/docker-snmp-sv2.mk
+++ b/rules/docker-snmp-sv2.mk
@@ -4,7 +4,7 @@ DOCKER_SNMP_SV2 = docker-snmp-sv2.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)_PYTHON_WHEELS += $(ASYNCSNMP_PY3)
+$(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)
diff --git a/src/snmpd/Makefile b/src/snmpd/Makefile
index 457cd2ef05d..b372f0d2245 100644
--- a/src/snmpd/Makefile
+++ b/src/snmpd/Makefile
@@ -23,6 +23,7 @@ $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
dpkg-source -x net-snmp_$(SNMPD_VERSION_FULL).dsc
pushd net-snmp-$(SNMPD_VERSION)
+ patch -p0 < ../statfs_error.patch
fakeroot debian/rules -j$(SONIC_CONFIG_MAKE_JOBS) binary
popd
diff --git a/src/snmpd/statfs_error.patch b/src/snmpd/statfs_error.patch
new file mode 100644
index 00000000000..a07b59bc917
--- /dev/null
+++ b/src/snmpd/statfs_error.patch
@@ -0,0 +1,22 @@
+--- agent/mibgroup/hardware/fsys/fsys_mntctl.c.old 2018-04-30 23:26:58.097636453 +0000
++++ agent/mibgroup/hardware/fsys/fsys_mntctl.c 2018-04-30 23:27:36.189499479 +0000
+@@ -163,8 +163,6 @@
+ continue;
+
+ if ( statfs( entry->path, &stat_buf ) < 0 ) {
+- snprintf( tmpbuf, sizeof(tmpbuf), "Cannot statfs %s", entry->path );
+- snmp_log_perror( tmpbuf );
+ continue;
+ }
+ entry->units = stat_buf.f_bsize;
+--- agent/mibgroup/hardware/fsys/fsys_mntent.c.old 2018-04-30 23:26:54.569649140 +0000
++++ agent/mibgroup/hardware/fsys/fsys_mntent.c 2018-04-30 23:27:22.001550497 +0000
+@@ -238,8 +238,6 @@
+ if ( NSFS_STATFS( entry->path, &stat_buf ) < 0 )
+ #endif
+ {
+- snprintf( tmpbuf, sizeof(tmpbuf), "Cannot statfs %s", entry->path );
+- snmp_log_perror( tmpbuf );
+ continue;
+ }
+ entry->units = stat_buf.NSFS_SIZE;
diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py
index dba1a6516cf..443893c66c2 100644
--- a/src/sonic-config-engine/minigraph.py
+++ b/src/sonic-config-engine/minigraph.py
@@ -216,6 +216,8 @@ def parse_dpg(dpg, hname):
acls[aclname] = {'policy_desc': aclname,
'ports': acl_intfs,
'type': 'MIRROR' if is_mirror else 'L3'}
+ elif is_mirror:
+ acls[aclname] = {'policy_desc': aclname, 'type': 'MIRROR'}
else:
# This ACL has no interfaces to attach to -- consider this a control plane ACL
try:
diff --git a/src/sonic-config-engine/tests/sample_output/bgpd.conf b/src/sonic-config-engine/tests/sample_output/bgpd.conf
new file mode 100644
index 00000000000..4416b462856
--- /dev/null
+++ b/src/sonic-config-engine/tests/sample_output/bgpd.conf
@@ -0,0 +1,91 @@
+!
+! =========== Managed by sonic-cfggen DO NOT edit manually! ====================
+! generated by templates/quagga/bgpd.conf.j2 with config DB data
+! file: bgpd.conf
+!
+!
+hostname switch-t0
+password zebra
+log syslog informational
+log facility local4
+! enable password !
+!
+! bgp multiple-instance
+!
+route-map FROM_BGP_SPEAKER_V4 permit 10
+!
+route-map TO_BGP_SPEAKER_V4 deny 10
+!
+router bgp 65100
+ bgp log-neighbor-changes
+ bgp bestpath as-path multipath-relax
+ no bgp default ipv4-unicast
+ bgp graceful-restart
+ bgp router-id 10.1.0.32
+ network 10.1.0.32/32
+ address-family ipv6
+ network fc00:1::32/64
+ exit-address-family
+ network 192.168.0.1/27
+ neighbor 10.0.0.57 remote-as 64600
+ neighbor 10.0.0.57 description ARISTA01T1
+ address-family ipv4
+ neighbor 10.0.0.57 allowas-in 1
+ neighbor 10.0.0.57 activate
+ maximum-paths 64
+ exit-address-family
+ neighbor 10.0.0.59 remote-as 64600
+ neighbor 10.0.0.59 description ARISTA02T1
+ address-family ipv4
+ neighbor 10.0.0.59 allowas-in 1
+ neighbor 10.0.0.59 activate
+ maximum-paths 64
+ exit-address-family
+ neighbor 10.0.0.61 remote-as 64600
+ neighbor 10.0.0.61 description ARISTA03T1
+ address-family ipv4
+ neighbor 10.0.0.61 allowas-in 1
+ neighbor 10.0.0.61 activate
+ maximum-paths 64
+ exit-address-family
+ neighbor 10.0.0.63 remote-as 64600
+ neighbor 10.0.0.63 description ARISTA04T1
+ address-family ipv4
+ neighbor 10.0.0.63 allowas-in 1
+ neighbor 10.0.0.63 activate
+ maximum-paths 64
+ exit-address-family
+ neighbor fc00::7a remote-as 64600
+ neighbor fc00::7a description ARISTA03T1
+ address-family ipv6
+ neighbor fc00::7a allowas-in 1
+ neighbor fc00::7a activate
+ maximum-paths 64
+ exit-address-family
+ neighbor fc00::7e remote-as 64600
+ neighbor fc00::7e description ARISTA04T1
+ address-family ipv6
+ neighbor fc00::7e allowas-in 1
+ neighbor fc00::7e activate
+ maximum-paths 64
+ exit-address-family
+ neighbor fc00::72 remote-as 64600
+ neighbor fc00::72 description ARISTA01T1
+ address-family ipv6
+ neighbor fc00::72 allowas-in 1
+ neighbor fc00::72 activate
+ maximum-paths 64
+ exit-address-family
+ neighbor fc00::76 remote-as 64600
+ neighbor fc00::76 description ARISTA02T1
+ address-family ipv6
+ neighbor fc00::76 allowas-in 1
+ neighbor fc00::76 activate
+ maximum-paths 64
+ exit-address-family
+!
+maximum-paths 64
+!
+route-map ISOLATE permit 10
+set as-path prepend 65100
+!
diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces
index c8da2fee8f7..96dc577ffe8 100644
--- a/src/sonic-config-engine/tests/sample_output/interfaces
+++ b/src/sonic-config-engine/tests/sample_output/interfaces
@@ -15,6 +15,10 @@ iface lo inet6 static
address fc00:1::32
netmask 128
#
+iface lo inet static
+ address 10.10.0.99
+ netmask 255.255.255.255
+#
# The management network interface
auto eth0
iface eth0 inet static
diff --git a/src/sonic-config-engine/tests/sample_output/lldpd.conf b/src/sonic-config-engine/tests/sample_output/lldpd.conf
index 049d9f09059..29739cb890d 100644
--- a/src/sonic-config-engine/tests/sample_output/lldpd.conf
+++ b/src/sonic-config-engine/tests/sample_output/lldpd.conf
@@ -1,6 +1,2 @@
configure ports eth0 lldp portidsubtype local eth0
-configure ports Ethernet112 lldp portidsubtype local fortyGigE0/112 description ARISTA01T1:Ethernet1/1
-configure ports Ethernet116 lldp portidsubtype local fortyGigE0/116 description ARISTA02T1:Ethernet1/1
-configure ports Ethernet120 lldp portidsubtype local fortyGigE0/120 description ARISTA03T1:Ethernet1/1
-configure ports Ethernet124 lldp portidsubtype local fortyGigE0/124 description ARISTA04T1:Ethernet1/1
diff --git a/src/sonic-config-engine/tests/sample_output/zebra.conf b/src/sonic-config-engine/tests/sample_output/zebra.conf
new file mode 100644
index 00000000000..aa3486b0163
--- /dev/null
+++ b/src/sonic-config-engine/tests/sample_output/zebra.conf
@@ -0,0 +1,44 @@
+!
+! =========== Managed by sonic-cfggen DO NOT edit manually! ====================
+! generated by templates/quagga/zebra.conf.j2 using config DB data
+! file: zebra.conf
+!
+!
+hostname switch-t0
+password zebra
+enable password zebra
+!
+! Enable link-detect (default disabled)
+interface PortChannel01
+link-detect
+!
+interface PortChannel02
+link-detect
+!
+interface PortChannel03
+link-detect
+!
+interface PortChannel04
+link-detect
+!
+!
+! set static default route to mgmt gateway as a backup to learned default
+ip route 0.0.0.0/0 10.0.0.1 200
+!
+! Set ip source to loopback for bgp learned routes
+route-map RM_SET_SRC permit 10
+ set src 10.1.0.32
+!
+
+route-map RM_SET_SRC6 permit 10
+ set src fc00:1::32
+!
+ip protocol bgp route-map RM_SET_SRC
+!
+ipv6 protocol bgp route-map RM_SET_SRC6
+!
+!
+log syslog informational
+log facility local4
+!
+
diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml
index bda5517771e..ce0177d4c15 100644
--- a/src/sonic-config-engine/tests/t0-sample-graph.xml
+++ b/src/sonic-config-engine/tests/t0-sample-graph.xml
@@ -153,7 +153,15 @@
FC00:1::32/128
-
+
+ LoopbackIP1
+ Loopback1
+
+ 10.10.0.99/32
+
+ 10.10.0.99/32
+
+
HostIP
diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py
index 8ff974c1eb1..bda3a20dbdf 100644
--- a/src/sonic-config-engine/tests/test_j2files.py
+++ b/src/sonic-config-engine/tests/test_j2files.py
@@ -20,6 +20,9 @@ def setUp(self):
def run_script(self, argument):
print 'CMD: sonic-cfggen ' + argument
return subprocess.check_output(self.script_file + ' ' + argument, shell=True)
+
+ def run_diff(self, file1, file2, diff):
+ return subprocess.check_output('diff {} {} >{}'.format(file1, file2, diff), shell=True)
def test_interfaces(self):
interfaces_template = os.path.join(self.test_dir, '..', '..', '..', 'files', 'image_config', 'interfaces', 'interfaces.j2')
@@ -59,6 +62,18 @@ def test_lldp(self):
self.run_script(argument)
self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'lldpd.conf'), self.output_file))
+ def test_bgpd(self):
+ conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-fpm-quagga', 'bgpd.conf.j2')
+ argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + conf_template + ' > ' + self.output_file
+ self.run_script(argument)
+ self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'bgpd.conf'), self.output_file))
+
+ def test_zebra(self):
+ conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-fpm-quagga', 'zebra.conf.j2')
+ argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + conf_template + ' > ' + self.output_file
+ self.run_script(argument)
+ self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'zebra.conf'), self.output_file))
+
def test_teamd(self):
def test_render_teamd(self, pc, minigraph, sample_output):
@@ -94,7 +109,6 @@ def test_ipinip(self):
self.run_script(argument)
sample_output_file = os.path.join(self.test_dir, 'sample_output', 'ipinip.json')
-
assert filecmp.cmp(sample_output_file, self.output_file)
def test_msn27xx_32ports_buffers(self):
diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel
index ed04b369038..b511c96bcea 160000
--- a/src/sonic-linux-kernel
+++ b/src/sonic-linux-kernel
@@ -1 +1 @@
-Subproject commit ed04b36903885ec065274174aa775e47695db2cb
+Subproject commit b511c96bcea09ae2b2adb3c3df7c4c41f14b6929
diff --git a/src/sonic-platform-common b/src/sonic-platform-common
index b553dba4ca8..9adb75feee6 160000
--- a/src/sonic-platform-common
+++ b/src/sonic-platform-common
@@ -1 +1 @@
-Subproject commit b553dba4ca82997dcc60a3b3a68111d7af8d62fc
+Subproject commit 9adb75feee6de75bd2e9faf542ac5610edc3fa35
diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent
index 12bc0e0c984..a03f7794d6b 160000
--- a/src/sonic-snmpagent
+++ b/src/sonic-snmpagent
@@ -1 +1 @@
-Subproject commit 12bc0e0c98432eb21add3b547e13bcf10e77ab51
+Subproject commit a03f7794d6b2faec23088ba064cb6ce7e7d2122a
diff --git a/src/sonic-swss b/src/sonic-swss
index 84ce5ed82ae..bb85c729c44 160000
--- a/src/sonic-swss
+++ b/src/sonic-swss
@@ -1 +1 @@
-Subproject commit 84ce5ed82ae564f74b3813db6abebd0e486f695d
+Subproject commit bb85c729c44b5fe1ea34ce59a368f34112180d30
diff --git a/src/sonic-utilities b/src/sonic-utilities
index da9476e90a7..b69837c009c 160000
--- a/src/sonic-utilities
+++ b/src/sonic-utilities
@@ -1 +1 @@
-Subproject commit da9476e90a7d5c9f784f5f22e0bcda13f4450c2b
+Subproject commit b69837c009c9167651a59ee9bd90c3938b4d06b2