diff --git a/build_debian.sh b/build_debian.sh
index fac25f18de6b..f63edfe9a134 100755
--- a/build_debian.sh
+++ b/build_debian.sh
@@ -200,7 +200,7 @@ sudo LANG=C chroot $FILESYSTEM_ROOT rm /tmp/docker.gpg
sudo LANG=C chroot $FILESYSTEM_ROOT add-apt-repository \
"deb [arch=$CONFIGURED_ARCH] https://download.docker.com/linux/debian stretch stable"
sudo LANG=C chroot $FILESYSTEM_ROOT apt-get update
-sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install docker-ce=${DOCKER_VERSION}
+sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install docker-ce=${DOCKER_VERSION} docker-ce-cli=${DOCKER_VERSION}
sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y remove software-properties-common gnupg2
if [ "$INSTALL_KUBERNETES" == "y" ]
diff --git a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm
index 217d15b4e579..e66e2e98416e 100644
--- a/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm
+++ b/device/arista/x86_64-arista_7050cx3_32s/Arista-7050CX3-32S-C32/td3-a7050cx3-32s-32x100G.config.bcm
@@ -35,7 +35,6 @@ port_phy_addr=0xff
robust_hash_disable_egress_vlan=1
robust_hash_disable_mpls=1
robust_hash_disable_vlan=1
-sram_scan_enable=0
stable_size=0x5500000
tdma_timeout_usec=15000000
tslam_timeout_usec=15000000
diff --git a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/th3-a7060px4-32-64x100G.config.bcm b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/th3-a7060px4-32-64x100G.config.bcm
index 5002d29045ab..f4450ebac53f 100644
--- a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/th3-a7060px4-32-64x100G.config.bcm
+++ b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-C64/th3-a7060px4-32-64x100G.config.bcm
@@ -872,7 +872,6 @@ port_phy_addr_147.0=0xff
robust_hash_disable_egress_vlan.0=1
robust_hash_disable_mpls.0=1
robust_hash_disable_vlan.0=1
-sram_scan_enable.0=0
tdma_timeout_usec.0=15000000
tslam_timeout_usec.0=15000000
diff --git a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm
index d3a66dee635f..cdbc4f4430b4 100644
--- a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm
+++ b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm
@@ -744,7 +744,6 @@ port_phy_addr_143.0=0xff
robust_hash_disable_egress_vlan.0=1
robust_hash_disable_mpls.0=1
robust_hash_disable_vlan.0=1
-sram_scan_enable.0=0
tdma_timeout_usec.0=15000000
tslam_timeout_usec.0=15000000
diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/pmon_daemon_control.json b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/pmon_daemon_control.json
index 3a76f2fdd0e4..ea20aeb1f83b 100644
--- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/pmon_daemon_control.json
+++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/pmon_daemon_control.json
@@ -1,6 +1,7 @@
{
+ "skip_fancontrol": true,
"skip_ledd": true,
"skip_xcvrd": false,
"skip_psud": false,
- "skip_syseepromd": false
+ "skip_syseepromd": false
}
diff --git a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/pmon_daemon_control.json b/device/barefoot/x86_64-accton_wedge100bf_65x-r0/pmon_daemon_control.json
index 3a76f2fdd0e4..ea20aeb1f83b 100644
--- a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/pmon_daemon_control.json
+++ b/device/barefoot/x86_64-accton_wedge100bf_65x-r0/pmon_daemon_control.json
@@ -1,6 +1,7 @@
{
+ "skip_fancontrol": true,
"skip_ledd": true,
"skip_xcvrd": false,
"skip_psud": false,
- "skip_syseepromd": false
+ "skip_syseepromd": false
}
diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/sensors.conf b/device/dell/x86_64-dell_s6000_s1220-r0/sensors.conf
index c87af11afacc..f74a2b3d40ac 100644
--- a/device/dell/x86_64-dell_s6000_s1220-r0/sensors.conf
+++ b/device/dell/x86_64-dell_s6000_s1220-r0/sensors.conf
@@ -7,8 +7,8 @@
# tmp75-i2c-11-4e is an ambient temperature sensor.
chip "tmp75-*"
- set temp1_max 50
- set temp1_max_hyst 25
+ set temp1_max 80
+ set temp1_max_hyst 70
# emc1403-i2c-10-4d has following temperature sensors:
# temp1: CPU0 external Temp Sensor
@@ -32,5 +32,5 @@ chip "jc42-*"
set temp1_crit 85
chip "dni_dps460-*"
- set temp1_max 50
- set temp2_max 50
+ set temp1_max 80
+ set temp2_max 80
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/buffers.json.j2 b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/buffers.json.j2
new file mode 100644
index 000000000000..0b1cb2c541b6
--- /dev/null
+++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/buffers.json.j2
@@ -0,0 +1,2 @@
+{%- set default_topo = 't1' %}
+{%- include 'buffers_config.j2' %}
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/buffers_defaults_t0.j2 b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/buffers_defaults_t0.j2
new file mode 100644
index 000000000000..98ec91a9b694
--- /dev/null
+++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/buffers_defaults_t0.j2
@@ -0,0 +1,37 @@
+
+{%- set default_cable = '40m' %}
+
+{%- macro generate_buffer_pool_and_profiles() %}
+ "BUFFER_POOL": {
+ "ingress_lossless_pool": {
+ "size": "28550336",
+ "type": "ingress",
+ "mode": "dynamic",
+ "xoff": "4194112"
+ },
+ "egress_pool": {
+ "size": "28550336",
+ "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_pool]",
+ "size":"0",
+ "mode": "static",
+ "static_th":"32744448"
+ },
+ "egress_lossy_profile": {
+ "pool":"[BUFFER_POOL|egress_pool]",
+ "size":"0",
+ "mode": "dynamic",
+ "dynamic_th":"3"
+ }
+ },
+{%- endmacro %}
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/buffers_defaults_t1.j2 b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/buffers_defaults_t1.j2
new file mode 100644
index 000000000000..98ec91a9b694
--- /dev/null
+++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/buffers_defaults_t1.j2
@@ -0,0 +1,37 @@
+
+{%- set default_cable = '40m' %}
+
+{%- macro generate_buffer_pool_and_profiles() %}
+ "BUFFER_POOL": {
+ "ingress_lossless_pool": {
+ "size": "28550336",
+ "type": "ingress",
+ "mode": "dynamic",
+ "xoff": "4194112"
+ },
+ "egress_pool": {
+ "size": "28550336",
+ "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_pool]",
+ "size":"0",
+ "mode": "static",
+ "static_th":"32744448"
+ },
+ "egress_lossy_profile": {
+ "pool":"[BUFFER_POOL|egress_pool]",
+ "size":"0",
+ "mode": "dynamic",
+ "dynamic_th":"3"
+ }
+ },
+{%- endmacro %}
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/custom_led.bin b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/custom_led.bin
new file mode 100755
index 000000000000..49e559cd9813
Binary files /dev/null and b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/custom_led.bin differ
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/linkscan_led_fw.bin b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/linkscan_led_fw.bin
new file mode 100755
index 000000000000..c2fa94a2d8cb
Binary files /dev/null and b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/linkscan_led_fw.bin differ
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/pg_profile_lookup.ini b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/pg_profile_lookup.ini
new file mode 100644
index 000000000000..aedda37a8878
--- /dev/null
+++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/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/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/port_config.ini b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/port_config.ini
new file mode 100644
index 000000000000..b7a336827ffe
--- /dev/null
+++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/port_config.ini
@@ -0,0 +1,59 @@
+# name lanes alias index speed
+Ethernet0 1,2 fiftyGigE1/1/1 1 50000
+Ethernet2 3,4 fiftyGigE1/1/2 1 50000
+Ethernet4 5,6 fiftyGigE1/2/1 2 50000
+Ethernet6 7,8 fiftyGigE1/2/2 2 50000
+Ethernet8 9,10 fiftyGigE1/3/1 3 50000
+Ethernet10 11,12 fiftyGigE1/3/2 3 50000
+Ethernet12 13,14 fiftyGigE1/4/1 4 50000
+Ethernet14 15,16 fiftyGigE1/4/2 4 50000
+Ethernet16 17,18 fiftyGigE1/5/1 5 50000
+Ethernet18 19,20 fiftyGigE1/5/2 5 50000
+Ethernet20 21,22 fiftyGigE1/6/1 6 50000
+Ethernet22 23,24 fiftyGigE1/6/2 6 50000
+Ethernet24 25,26,27,28 hundredGigE1/7 7 100000
+Ethernet28 29,30,31,32 hundredGigE1/8 8 100000
+Ethernet32 33,34,35,36 hundredGigE1/9 9 100000
+Ethernet36 37,38,39,40 hundredGigE1/10 10 100000
+Ethernet40 41,42 fiftyGigE1/11/1 11 50000
+Ethernet42 43,44 fiftyGigE1/11/2 11 50000
+Ethernet44 45,46 fiftyGigE1/12/1 12 50000
+Ethernet46 47,48 fiftyGigE1/12/2 12 50000
+Ethernet48 49,50 fiftyGigE1/13/1 13 50000
+Ethernet50 51,52 fiftyGigE1/13/2 13 50000
+Ethernet52 53,54 fiftyGigE1/14/1 14 50000
+Ethernet54 55,56 fiftyGigE1/14/2 14 50000
+Ethernet56 57,58 fiftyGigE1/15/1 15 50000
+Ethernet58 59,60 fiftyGigE1/15/2 15 50000
+Ethernet60 61,62 fiftyGigE1/16/1 16 50000
+Ethernet62 63,64 fiftyGigE1/16/2 16 50000
+Ethernet64 65,66 fiftyGigE1/17/1 17 50000
+Ethernet66 67,68 fiftyGigE1/17/2 17 50000
+Ethernet68 69,70 fiftyGigE1/18/1 18 50000
+Ethernet70 71,72 fiftyGigE1/18/2 18 50000
+Ethernet72 73,74 fiftyGigE1/19/1 19 50000
+Ethernet74 75,76 fiftyGigE1/19/2 19 50000
+Ethernet76 77,78 fiftyGigE1/20/1 20 50000
+Ethernet78 79,80 fiftyGigE1/20/2 20 50000
+Ethernet80 81,82 fiftyGigE1/21/1 21 50000
+Ethernet82 83,84 fiftyGigE1/21/2 21 50000
+Ethernet84 85,86 fiftyGigE1/22/1 22 50000
+Ethernet86 87,88 fiftyGigE1/22/2 22 50000
+Ethernet88 89,90 fiftyGigE1/23/1 23 50000
+Ethernet90 91,92 fiftyGigE1/23/2 23 50000
+Ethernet92 93,94 fiftyGigE1/24/1 24 50000
+Ethernet94 95,96 fiftyGigE1/24/2 24 50000
+Ethernet96 97,98 fiftyGigE1/25/1 25 50000
+Ethernet98 99,100 fiftyGigE1/25/2 25 50000
+Ethernet100 101,102 fiftyGigE1/26/1 26 50000
+Ethernet102 103,104 fiftyGigE1/26/2 26 50000
+Ethernet104 105,106,107,108 hundredGigE1/27 27 100000
+Ethernet108 109,110,111,112 hundredGigE1/28 28 100000
+Ethernet112 113,114,115,116 hundredGigE1/29 29 100000
+Ethernet116 117,118,119,120 hundredGigE1/30 30 100000
+Ethernet120 121,122 fiftyGigE1/31/1 31 50000
+Ethernet122 123,124 fiftyGigE1/31/2 31 50000
+Ethernet124 125,126 fiftyGigE1/32/1 32 50000
+Ethernet126 127,128 fiftyGigE1/32/2 32 50000
+Ethernet128 129 tenGigE1/33 33 10000
+Ethernet129 128 tenGigE1/34 34 10000
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/qos.json.j2 b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/qos.json.j2
new file mode 100644
index 000000000000..3e548325ea30
--- /dev/null
+++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/qos.json.j2
@@ -0,0 +1 @@
+{%- include 'qos_config.j2' %}
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai.profile b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai.profile
new file mode 100644
index 000000000000..0daed30c3bc2
--- /dev/null
+++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai.profile
@@ -0,0 +1 @@
+SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-s5232f-8x100G+48x50G.config.bcm
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai_preinit_cmd.soc b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai_preinit_cmd.soc
new file mode 100644
index 000000000000..4d62900f898f
--- /dev/null
+++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/sai_preinit_cmd.soc
@@ -0,0 +1,2 @@
+m0 load 0 0x0 /usr/share/sonic/hwsku/linkscan_led_fw.bin
+m0 load 0 0x3800 /usr/share/sonic/hwsku/custom_led.bin
diff --git a/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/td3-s5232f-8x100G+48x50G.config.bcm b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/td3-s5232f-8x100G+48x50G.config.bcm
new file mode 100644
index 000000000000..cf0bfd043ee0
--- /dev/null
+++ b/device/dell/x86_64-dellemc_s5232f_c3538-r0/DellEMC-S5232f-C8D48/td3-s5232f-8x100G+48x50G.config.bcm
@@ -0,0 +1,572 @@
+os=unix
+
+core_clock_frequency=1525
+dpp_clock_ratio=2:3
+
+parity_enable=1
+parity_correction=1
+tdma_intr_enable=1
+schan_intr_enable=0
+tdma_intr_enable=1
+miim_intr_enable=1
+stat_if_parity_enable=1
+
+port_flex_enable=1
+port_flex_enable_66=0
+port_flex_enable_130=0
+phy_an_c73=3
+phy_an_c73_66=0
+phy_an_c73_130=0
+
+module_64ports=0
+table_dma_enable=1
+tdma_timeout_usec=5000000
+mmu_lossless=0
+pdma_descriptor_prefetch_enable=1
+pktdma_poll_mode_channel_bitmap=1
+
+l2xmsg_mode=1
+l2xmsg_hostbuf_size=8192
+ipv6_lpm_128b_enable=1
+max_vp_lags=0
+
+l3_alpm_enable=2
+l2_mem_entries=32768
+l3_mem_entries=16384
+l3_max_ecmp_mode=1
+
+bcm_tunnel_term_compatible_mode=1
+ifp_inports_support_enable=1
+
+stable_size=0x5500000
+
+oversubscribe_mode=1
+pbmp_oversubscribe=0x6fffffffffffffffdfffffffffffffffe
+pbmp_xport_xe=0x6fffffffffffffffdfffffffffffffffe
+
+
+portmap_1.0=1:50:2
+portmap_3.0=3:50:2
+portmap_5.0=5:50:2
+portmap_7.0=7:50:2
+portmap_9.0=9:50:2
+portmap_11.0=11:50:2
+portmap_13.0=13:50:2
+portmap_15.0=15:50:2
+portmap_17.0=17:50:2
+portmap_19.0=19:50:2
+portmap_21.0=21:50:2
+portmap_23.0=23:50:2
+portmap_25.0=25:100
+portmap_29.0=29:100
+portmap_33.0=33:100
+portmap_37.0=37:100
+portmap_41.0=41:50:2
+portmap_43.0=43:50:2
+portmap_45.0=45:50:2
+portmap_47.0=47:50:2
+portmap_49.0=49:50:2
+portmap_51.0=51:50:2
+portmap_53.0=53:50:2
+portmap_55.0=55:50:2
+portmap_57.0=57:50:2
+portmap_59.0=59:50:2
+portmap_61.0=61:50:2
+portmap_63.0=63:50:2
+portmap_67.0=65:50:2
+portmap_69.0=67:50:2
+portmap_71.0=69:50:2
+portmap_73.0=71:50:2
+portmap_75.0=73:50:2
+portmap_77.0=75:50:2
+portmap_79.0=77:50:2
+portmap_81.0=79:50:2
+portmap_83.0=81:50:2
+portmap_85.0=83:50:2
+portmap_87.0=85:50:2
+portmap_89.0=87:50:2
+portmap_91.0=89:50:2
+portmap_93.0=91:50:2
+portmap_95.0=93:50:2
+portmap_97.0=95:50:2
+portmap_99.0=97:50:2
+portmap_101.0=99:50:2
+portmap_103.0=101:50:2
+portmap_105.0=103:50:2
+portmap_107.0=105:100
+portmap_111.0=109:100
+portmap_115.0=113:100
+portmap_119.0=117:100
+portmap_123.0=121:50:2
+portmap_125.0=123:50:2
+portmap_127.0=125:50:2
+portmap_129.0=127:50:2
+portmap_130.0=128:10:m
+portmap_66.0=129:10:m
+
+
+phy_chain_tx_lane_map_physical{1.0}=0x0132
+phy_chain_rx_lane_map_physical{1.0}=0x3210
+phy_chain_tx_lane_map_physical{5.0}=0x2301
+phy_chain_rx_lane_map_physical{5.0}=0x2031
+phy_chain_tx_lane_map_physical{9.0}=0x0132
+phy_chain_rx_lane_map_physical{9.0}=0x3210
+phy_chain_tx_lane_map_physical{13.0}=0x3201
+phy_chain_rx_lane_map_physical{13.0}=0x2031
+phy_chain_tx_lane_map_physical{17.0}=0x0123
+phy_chain_rx_lane_map_physical{17.0}=0x3210
+phy_chain_tx_lane_map_physical{21.0}=0x2301
+phy_chain_rx_lane_map_physical{21.0}=0x2031
+phy_chain_tx_lane_map_physical{25.0}=0x0123
+phy_chain_rx_lane_map_physical{25.0}=0x3210
+phy_chain_tx_lane_map_physical{29.0}=0x3201
+phy_chain_rx_lane_map_physical{29.0}=0x2031
+phy_chain_tx_lane_map_physical{33.0}=0x0213
+phy_chain_rx_lane_map_physical{33.0}=0x1302
+phy_chain_tx_lane_map_physical{37.0}=0x1302
+phy_chain_rx_lane_map_physical{37.0}=0x2031
+phy_chain_tx_lane_map_physical{41.0}=0x0231
+phy_chain_rx_lane_map_physical{41.0}=0x3120
+phy_chain_tx_lane_map_physical{45.0}=0x1302
+phy_chain_rx_lane_map_physical{45.0}=0x2031
+phy_chain_tx_lane_map_physical{49.0}=0x2103
+phy_chain_rx_lane_map_physical{49.0}=0x3120
+phy_chain_tx_lane_map_physical{53.0}=0x2301
+phy_chain_rx_lane_map_physical{53.0}=0x2031
+phy_chain_tx_lane_map_physical{57.0}=0x0123
+phy_chain_rx_lane_map_physical{57.0}=0x2301
+phy_chain_tx_lane_map_physical{61.0}=0x3210
+phy_chain_rx_lane_map_physical{61.0}=0x1032
+phy_chain_tx_lane_map_physical{65.0}=0x3210
+phy_chain_rx_lane_map_physical{65.0}=0x1023
+phy_chain_tx_lane_map_physical{69.0}=0x0123
+phy_chain_rx_lane_map_physical{69.0}=0x1302
+phy_chain_tx_lane_map_physical{73.0}=0x2301
+phy_chain_rx_lane_map_physical{73.0}=0x1032
+phy_chain_tx_lane_map_physical{77.0}=0x2013
+phy_chain_rx_lane_map_physical{77.0}=0x3120
+phy_chain_tx_lane_map_physical{81.0}=0x1302
+phy_chain_rx_lane_map_physical{81.0}=0x2031
+phy_chain_tx_lane_map_physical{85.0}=0x0123
+phy_chain_rx_lane_map_physical{85.0}=0x2130
+phy_chain_tx_lane_map_physical{89.0}=0x2301
+phy_chain_rx_lane_map_physical{89.0}=0x2031
+phy_chain_tx_lane_map_physical{93.0}=0x0312
+phy_chain_rx_lane_map_physical{93.0}=0x2310
+phy_chain_tx_lane_map_physical{97.0}=0x2301
+phy_chain_rx_lane_map_physical{97.0}=0x1032
+phy_chain_tx_lane_map_physical{101.0}=0x0123
+phy_chain_rx_lane_map_physical{101.0}=0x3210
+phy_chain_tx_lane_map_physical{105.0}=0x2301
+phy_chain_rx_lane_map_physical{105.0}=0x1032
+phy_chain_tx_lane_map_physical{109.0}=0x0123
+phy_chain_rx_lane_map_physical{109.0}=0x3210
+phy_chain_tx_lane_map_physical{113.0}=0x2301
+phy_chain_rx_lane_map_physical{113.0}=0x2031
+phy_chain_tx_lane_map_physical{117.0}=0x0123
+phy_chain_rx_lane_map_physical{117.0}=0x3210
+phy_chain_tx_lane_map_physical{121.0}=0x2301
+phy_chain_rx_lane_map_physical{121.0}=0x1032
+phy_chain_tx_lane_map_physical{125.0}=0x0123
+phy_chain_rx_lane_map_physical{125.0}=0x3210
+phy_chain_tx_lane_map_physical{129.0}=0x3210
+phy_chain_rx_lane_map_physical{129.0}=0x0231
+phy_chain_tx_lane_map_physical{128.0}=0x3210
+phy_chain_rx_lane_map_physical{128.0}=0x0231
+phy_chain_tx_polarity_flip_physical{1.0}=0x0
+phy_chain_rx_polarity_flip_physical{1.0}=0x0
+phy_chain_tx_polarity_flip_physical{2.0}=0x0
+phy_chain_rx_polarity_flip_physical{2.0}=0x1
+phy_chain_tx_polarity_flip_physical{3.0}=0x0
+phy_chain_rx_polarity_flip_physical{3.0}=0x0
+phy_chain_tx_polarity_flip_physical{4.0}=0x1
+phy_chain_rx_polarity_flip_physical{4.0}=0x1
+phy_chain_tx_polarity_flip_physical{5.0}=0x0
+phy_chain_rx_polarity_flip_physical{5.0}=0x0
+phy_chain_tx_polarity_flip_physical{6.0}=0x1
+phy_chain_rx_polarity_flip_physical{6.0}=0x1
+phy_chain_tx_polarity_flip_physical{7.0}=0x0
+phy_chain_rx_polarity_flip_physical{7.0}=0x1
+phy_chain_tx_polarity_flip_physical{8.0}=0x1
+phy_chain_rx_polarity_flip_physical{8.0}=0x1
+phy_chain_tx_polarity_flip_physical{9.0}=0x0
+phy_chain_rx_polarity_flip_physical{9.0}=0x0
+phy_chain_tx_polarity_flip_physical{10.0}=0x0
+phy_chain_rx_polarity_flip_physical{10.0}=0x1
+phy_chain_tx_polarity_flip_physical{11.0}=0x0
+phy_chain_rx_polarity_flip_physical{11.0}=0x0
+phy_chain_tx_polarity_flip_physical{12.0}=0x1
+phy_chain_rx_polarity_flip_physical{12.0}=0x1
+phy_chain_tx_polarity_flip_physical{13.0}=0x0
+phy_chain_rx_polarity_flip_physical{13.0}=0x0
+phy_chain_tx_polarity_flip_physical{14.0}=0x1
+phy_chain_rx_polarity_flip_physical{14.0}=0x1
+phy_chain_tx_polarity_flip_physical{15.0}=0x0
+phy_chain_rx_polarity_flip_physical{15.0}=0x1
+phy_chain_tx_polarity_flip_physical{16.0}=0x0
+phy_chain_rx_polarity_flip_physical{16.0}=0x1
+phy_chain_tx_polarity_flip_physical{17.0}=0x0
+phy_chain_rx_polarity_flip_physical{17.0}=0x0
+phy_chain_tx_polarity_flip_physical{18.0}=0x1
+phy_chain_rx_polarity_flip_physical{18.0}=0x1
+phy_chain_tx_polarity_flip_physical{19.0}=0x0
+phy_chain_rx_polarity_flip_physical{19.0}=0x0
+phy_chain_tx_polarity_flip_physical{20.0}=0x1
+phy_chain_rx_polarity_flip_physical{20.0}=0x1
+phy_chain_tx_polarity_flip_physical{21.0}=0x0
+phy_chain_rx_polarity_flip_physical{21.0}=0x0
+phy_chain_tx_polarity_flip_physical{22.0}=0x1
+phy_chain_rx_polarity_flip_physical{22.0}=0x1
+phy_chain_tx_polarity_flip_physical{23.0}=0x0
+phy_chain_rx_polarity_flip_physical{23.0}=0x1
+phy_chain_tx_polarity_flip_physical{24.0}=0x1
+phy_chain_rx_polarity_flip_physical{24.0}=0x1
+phy_chain_tx_polarity_flip_physical{25.0}=0x0
+phy_chain_rx_polarity_flip_physical{25.0}=0x1
+phy_chain_tx_polarity_flip_physical{26.0}=0x1
+phy_chain_rx_polarity_flip_physical{26.0}=0x0
+phy_chain_tx_polarity_flip_physical{27.0}=0x0
+phy_chain_rx_polarity_flip_physical{27.0}=0x1
+phy_chain_tx_polarity_flip_physical{28.0}=0x1
+phy_chain_rx_polarity_flip_physical{28.0}=0x0
+phy_chain_tx_polarity_flip_physical{29.0}=0x1
+phy_chain_rx_polarity_flip_physical{29.0}=0x1
+phy_chain_tx_polarity_flip_physical{30.0}=0x1
+phy_chain_rx_polarity_flip_physical{30.0}=0x0
+phy_chain_tx_polarity_flip_physical{31.0}=0x0
+phy_chain_rx_polarity_flip_physical{31.0}=0x0
+phy_chain_tx_polarity_flip_physical{32.0}=0x0
+phy_chain_rx_polarity_flip_physical{32.0}=0x0
+phy_chain_tx_polarity_flip_physical{33.0}=0x1
+phy_chain_rx_polarity_flip_physical{33.0}=0x1
+phy_chain_tx_polarity_flip_physical{34.0}=0x0
+phy_chain_rx_polarity_flip_physical{34.0}=0x0
+phy_chain_tx_polarity_flip_physical{35.0}=0x0
+phy_chain_rx_polarity_flip_physical{35.0}=0x0
+phy_chain_tx_polarity_flip_physical{36.0}=0x1
+phy_chain_rx_polarity_flip_physical{36.0}=0x0
+phy_chain_tx_polarity_flip_physical{37.0}=0x1
+phy_chain_rx_polarity_flip_physical{37.0}=0x1
+phy_chain_tx_polarity_flip_physical{38.0}=0x1
+phy_chain_rx_polarity_flip_physical{38.0}=0x0
+phy_chain_tx_polarity_flip_physical{39.0}=0x1
+phy_chain_rx_polarity_flip_physical{39.0}=0x0
+phy_chain_tx_polarity_flip_physical{40.0}=0x0
+phy_chain_rx_polarity_flip_physical{40.0}=0x1
+phy_chain_tx_polarity_flip_physical{41.0}=0x1
+phy_chain_rx_polarity_flip_physical{41.0}=0x1
+phy_chain_tx_polarity_flip_physical{42.0}=0x0
+phy_chain_rx_polarity_flip_physical{42.0}=0x1
+phy_chain_tx_polarity_flip_physical{43.0}=0x1
+phy_chain_rx_polarity_flip_physical{43.0}=0x0
+phy_chain_tx_polarity_flip_physical{44.0}=0x1
+phy_chain_rx_polarity_flip_physical{44.0}=0x1
+phy_chain_tx_polarity_flip_physical{45.0}=0x1
+phy_chain_rx_polarity_flip_physical{45.0}=0x0
+phy_chain_tx_polarity_flip_physical{46.0}=0x1
+phy_chain_rx_polarity_flip_physical{46.0}=0x0
+phy_chain_tx_polarity_flip_physical{47.0}=0x1
+phy_chain_rx_polarity_flip_physical{47.0}=0x1
+phy_chain_tx_polarity_flip_physical{48.0}=0x0
+phy_chain_rx_polarity_flip_physical{48.0}=0x1
+phy_chain_tx_polarity_flip_physical{49.0}=0x1
+phy_chain_rx_polarity_flip_physical{49.0}=0x0
+phy_chain_tx_polarity_flip_physical{50.0}=0x1
+phy_chain_rx_polarity_flip_physical{50.0}=0x0
+phy_chain_tx_polarity_flip_physical{51.0}=0x0
+phy_chain_rx_polarity_flip_physical{51.0}=0x1
+phy_chain_tx_polarity_flip_physical{52.0}=0x1
+phy_chain_rx_polarity_flip_physical{52.0}=0x1
+phy_chain_tx_polarity_flip_physical{53.0}=0x0
+phy_chain_rx_polarity_flip_physical{53.0}=0x0
+phy_chain_tx_polarity_flip_physical{54.0}=0x1
+phy_chain_rx_polarity_flip_physical{54.0}=0x1
+phy_chain_tx_polarity_flip_physical{55.0}=0x0
+phy_chain_rx_polarity_flip_physical{55.0}=0x1
+phy_chain_tx_polarity_flip_physical{56.0}=0x1
+phy_chain_rx_polarity_flip_physical{56.0}=0x1
+phy_chain_tx_polarity_flip_physical{57.0}=0x1
+phy_chain_rx_polarity_flip_physical{57.0}=0x0
+phy_chain_tx_polarity_flip_physical{58.0}=0x1
+phy_chain_rx_polarity_flip_physical{58.0}=0x1
+phy_chain_tx_polarity_flip_physical{59.0}=0x0
+phy_chain_rx_polarity_flip_physical{59.0}=0x0
+phy_chain_tx_polarity_flip_physical{60.0}=0x1
+phy_chain_rx_polarity_flip_physical{60.0}=0x1
+phy_chain_tx_polarity_flip_physical{61.0}=0x0
+phy_chain_rx_polarity_flip_physical{61.0}=0x1
+phy_chain_tx_polarity_flip_physical{62.0}=0x1
+phy_chain_rx_polarity_flip_physical{62.0}=0x0
+phy_chain_tx_polarity_flip_physical{63.0}=0x0
+phy_chain_rx_polarity_flip_physical{63.0}=0x1
+phy_chain_tx_polarity_flip_physical{64.0}=0x0
+phy_chain_rx_polarity_flip_physical{64.0}=0x0
+phy_chain_tx_polarity_flip_physical{65.0}=0x1
+phy_chain_rx_polarity_flip_physical{65.0}=0x0
+phy_chain_tx_polarity_flip_physical{66.0}=0x0
+phy_chain_rx_polarity_flip_physical{66.0}=0x0
+phy_chain_tx_polarity_flip_physical{67.0}=0x1
+phy_chain_rx_polarity_flip_physical{67.0}=0x1
+phy_chain_tx_polarity_flip_physical{68.0}=0x0
+phy_chain_rx_polarity_flip_physical{68.0}=0x0
+phy_chain_tx_polarity_flip_physical{69.0}=0x1
+phy_chain_rx_polarity_flip_physical{69.0}=0x1
+phy_chain_tx_polarity_flip_physical{70.0}=0x0
+phy_chain_rx_polarity_flip_physical{70.0}=0x0
+phy_chain_tx_polarity_flip_physical{71.0}=0x1
+phy_chain_rx_polarity_flip_physical{71.0}=0x0
+phy_chain_tx_polarity_flip_physical{72.0}=0x0
+phy_chain_rx_polarity_flip_physical{72.0}=0x0
+phy_chain_tx_polarity_flip_physical{73.0}=0x0
+phy_chain_rx_polarity_flip_physical{73.0}=0x1
+phy_chain_tx_polarity_flip_physical{74.0}=0x1
+phy_chain_rx_polarity_flip_physical{74.0}=0x0
+phy_chain_tx_polarity_flip_physical{75.0}=0x0
+phy_chain_rx_polarity_flip_physical{75.0}=0x1
+phy_chain_tx_polarity_flip_physical{76.0}=0x1
+phy_chain_rx_polarity_flip_physical{76.0}=0x0
+phy_chain_tx_polarity_flip_physical{77.0}=0x0
+phy_chain_rx_polarity_flip_physical{77.0}=0x0
+phy_chain_tx_polarity_flip_physical{78.0}=0x0
+phy_chain_rx_polarity_flip_physical{78.0}=0x0
+phy_chain_tx_polarity_flip_physical{79.0}=0x1
+phy_chain_rx_polarity_flip_physical{79.0}=0x1
+phy_chain_tx_polarity_flip_physical{80.0}=0x1
+phy_chain_rx_polarity_flip_physical{80.0}=0x1
+phy_chain_tx_polarity_flip_physical{81.0}=0x0
+phy_chain_rx_polarity_flip_physical{81.0}=0x0
+phy_chain_tx_polarity_flip_physical{82.0}=0x0
+phy_chain_rx_polarity_flip_physical{82.0}=0x0
+phy_chain_tx_polarity_flip_physical{83.0}=0x1
+phy_chain_rx_polarity_flip_physical{83.0}=0x1
+phy_chain_tx_polarity_flip_physical{84.0}=0x1
+phy_chain_rx_polarity_flip_physical{84.0}=0x0
+phy_chain_tx_polarity_flip_physical{85.0}=0x1
+phy_chain_rx_polarity_flip_physical{85.0}=0x1
+phy_chain_tx_polarity_flip_physical{86.0}=0x0
+phy_chain_rx_polarity_flip_physical{86.0}=0x1
+phy_chain_tx_polarity_flip_physical{87.0}=0x1
+phy_chain_rx_polarity_flip_physical{87.0}=0x0
+phy_chain_tx_polarity_flip_physical{88.0}=0x0
+phy_chain_rx_polarity_flip_physical{88.0}=0x0
+phy_chain_tx_polarity_flip_physical{89.0}=0x1
+phy_chain_rx_polarity_flip_physical{89.0}=0x0
+phy_chain_tx_polarity_flip_physical{90.0}=0x0
+phy_chain_rx_polarity_flip_physical{90.0}=0x0
+phy_chain_tx_polarity_flip_physical{91.0}=0x1
+phy_chain_rx_polarity_flip_physical{91.0}=0x1
+phy_chain_tx_polarity_flip_physical{92.0}=0x0
+phy_chain_rx_polarity_flip_physical{92.0}=0x1
+phy_chain_tx_polarity_flip_physical{93.0}=0x1
+phy_chain_rx_polarity_flip_physical{93.0}=0x1
+phy_chain_tx_polarity_flip_physical{94.0}=0x1
+phy_chain_rx_polarity_flip_physical{94.0}=0x1
+phy_chain_tx_polarity_flip_physical{95.0}=0x0
+phy_chain_rx_polarity_flip_physical{95.0}=0x0
+phy_chain_tx_polarity_flip_physical{96.0}=0x0
+phy_chain_rx_polarity_flip_physical{96.0}=0x1
+phy_chain_tx_polarity_flip_physical{97.0}=0x1
+phy_chain_rx_polarity_flip_physical{97.0}=0x1
+phy_chain_tx_polarity_flip_physical{98.0}=0x0
+phy_chain_rx_polarity_flip_physical{98.0}=0x0
+phy_chain_tx_polarity_flip_physical{99.0}=0x1
+phy_chain_rx_polarity_flip_physical{99.0}=0x1
+phy_chain_tx_polarity_flip_physical{100.0}=0x0
+phy_chain_rx_polarity_flip_physical{100.0}=0x0
+phy_chain_tx_polarity_flip_physical{101.0}=0x1
+phy_chain_rx_polarity_flip_physical{101.0}=0x0
+phy_chain_tx_polarity_flip_physical{102.0}=0x0
+phy_chain_rx_polarity_flip_physical{102.0}=0x1
+phy_chain_tx_polarity_flip_physical{103.0}=0x1
+phy_chain_rx_polarity_flip_physical{103.0}=0x0
+phy_chain_tx_polarity_flip_physical{104.0}=0x0
+phy_chain_rx_polarity_flip_physical{104.0}=0x0
+phy_chain_tx_polarity_flip_physical{105.0}=0x1
+phy_chain_rx_polarity_flip_physical{105.0}=0x0
+phy_chain_tx_polarity_flip_physical{106.0}=0x0
+phy_chain_rx_polarity_flip_physical{106.0}=0x1
+phy_chain_tx_polarity_flip_physical{107.0}=0x1
+phy_chain_rx_polarity_flip_physical{107.0}=0x0
+phy_chain_tx_polarity_flip_physical{108.0}=0x0
+phy_chain_rx_polarity_flip_physical{108.0}=0x1
+phy_chain_tx_polarity_flip_physical{109.0}=0x1
+phy_chain_rx_polarity_flip_physical{109.0}=0x1
+phy_chain_tx_polarity_flip_physical{110.0}=0x0
+phy_chain_rx_polarity_flip_physical{110.0}=0x0
+phy_chain_tx_polarity_flip_physical{111.0}=0x1
+phy_chain_rx_polarity_flip_physical{111.0}=0x1
+phy_chain_tx_polarity_flip_physical{112.0}=0x0
+phy_chain_rx_polarity_flip_physical{112.0}=0x0
+phy_chain_tx_polarity_flip_physical{113.0}=0x1
+phy_chain_rx_polarity_flip_physical{113.0}=0x1
+phy_chain_tx_polarity_flip_physical{114.0}=0x0
+phy_chain_rx_polarity_flip_physical{114.0}=0x0
+phy_chain_tx_polarity_flip_physical{115.0}=0x1
+phy_chain_rx_polarity_flip_physical{115.0}=0x0
+phy_chain_tx_polarity_flip_physical{116.0}=0x0
+phy_chain_rx_polarity_flip_physical{116.0}=0x0
+phy_chain_tx_polarity_flip_physical{117.0}=0x1
+phy_chain_rx_polarity_flip_physical{117.0}=0x1
+phy_chain_tx_polarity_flip_physical{118.0}=0x0
+phy_chain_rx_polarity_flip_physical{118.0}=0x0
+phy_chain_tx_polarity_flip_physical{119.0}=0x1
+phy_chain_rx_polarity_flip_physical{119.0}=0x1
+phy_chain_tx_polarity_flip_physical{120.0}=0x0
+phy_chain_rx_polarity_flip_physical{120.0}=0x0
+phy_chain_tx_polarity_flip_physical{121.0}=0x1
+phy_chain_rx_polarity_flip_physical{121.0}=0x0
+phy_chain_tx_polarity_flip_physical{122.0}=0x0
+phy_chain_rx_polarity_flip_physical{122.0}=0x1
+phy_chain_tx_polarity_flip_physical{123.0}=0x1
+phy_chain_rx_polarity_flip_physical{123.0}=0x0
+phy_chain_tx_polarity_flip_physical{124.0}=0x0
+phy_chain_rx_polarity_flip_physical{124.0}=0x1
+phy_chain_tx_polarity_flip_physical{125.0}=0x1
+phy_chain_rx_polarity_flip_physical{125.0}=0x1
+phy_chain_tx_polarity_flip_physical{126.0}=0x0
+phy_chain_rx_polarity_flip_physical{126.0}=0x0
+phy_chain_tx_polarity_flip_physical{127.0}=0x1
+phy_chain_rx_polarity_flip_physical{127.0}=0x1
+phy_chain_tx_polarity_flip_physical{128.0}=0x0
+phy_chain_rx_polarity_flip_physical{128.0}=0x0
+phy_chain_tx_polarity_flip_physical{129.0}=0x1
+phy_chain_rx_polarity_flip_physical{129.0}=0x0
+phy_chain_tx_polarity_flip_physical{130.0}=0x0
+phy_chain_rx_polarity_flip_physical{130.0}=0x0
+phy_chain_tx_polarity_flip_physical{131.0}=0x1
+phy_chain_rx_polarity_flip_physical{131.0}=0x1
+phy_chain_tx_polarity_flip_physical{132.0}=0x0
+phy_chain_rx_polarity_flip_physical{132.0}=0x1
+dport_map_enable=1
+dport_map_port_1=1
+dport_map_port_2=2
+dport_map_port_3=3
+dport_map_port_4=4
+dport_map_port_5=5
+dport_map_port_6=6
+dport_map_port_7=7
+dport_map_port_8=8
+dport_map_port_9=9
+dport_map_port_10=10
+dport_map_port_11=11
+dport_map_port_12=12
+dport_map_port_13=13
+dport_map_port_14=14
+dport_map_port_15=15
+dport_map_port_16=16
+dport_map_port_17=17
+dport_map_port_18=18
+dport_map_port_19=19
+dport_map_port_20=20
+dport_map_port_21=21
+dport_map_port_22=22
+dport_map_port_23=23
+dport_map_port_24=24
+dport_map_port_25=25
+dport_map_port_26=26
+dport_map_port_27=27
+dport_map_port_28=28
+dport_map_port_29=29
+dport_map_port_30=30
+dport_map_port_31=31
+dport_map_port_32=32
+dport_map_port_33=33
+dport_map_port_34=34
+dport_map_port_35=35
+dport_map_port_36=36
+dport_map_port_37=37
+dport_map_port_38=38
+dport_map_port_39=39
+dport_map_port_40=40
+dport_map_port_41=41
+dport_map_port_42=42
+dport_map_port_43=43
+dport_map_port_44=44
+dport_map_port_45=45
+dport_map_port_46=46
+dport_map_port_47=47
+dport_map_port_48=48
+dport_map_port_49=49
+dport_map_port_50=50
+dport_map_port_51=51
+dport_map_port_52=52
+dport_map_port_53=53
+dport_map_port_54=54
+dport_map_port_55=55
+dport_map_port_56=56
+dport_map_port_57=57
+dport_map_port_58=58
+dport_map_port_59=59
+dport_map_port_60=60
+dport_map_port_61=61
+dport_map_port_62=62
+dport_map_port_63=63
+dport_map_port_64=64
+dport_map_port_67=65
+dport_map_port_68=66
+dport_map_port_69=67
+dport_map_port_70=68
+dport_map_port_71=69
+dport_map_port_72=70
+dport_map_port_73=71
+dport_map_port_74=72
+dport_map_port_75=73
+dport_map_port_76=74
+dport_map_port_77=75
+dport_map_port_78=76
+dport_map_port_79=77
+dport_map_port_80=78
+dport_map_port_81=79
+dport_map_port_82=80
+dport_map_port_83=81
+dport_map_port_84=82
+dport_map_port_85=83
+dport_map_port_86=84
+dport_map_port_87=85
+dport_map_port_88=86
+dport_map_port_89=87
+dport_map_port_90=88
+dport_map_port_91=89
+dport_map_port_92=90
+dport_map_port_93=91
+dport_map_port_94=92
+dport_map_port_95=93
+dport_map_port_96=94
+dport_map_port_97=95
+dport_map_port_98=96
+dport_map_port_99=97
+dport_map_port_100=98
+dport_map_port_101=99
+dport_map_port_102=100
+dport_map_port_103=101
+dport_map_port_104=102
+dport_map_port_105=103
+dport_map_port_106=104
+dport_map_port_107=105
+dport_map_port_108=106
+dport_map_port_109=107
+dport_map_port_110=108
+dport_map_port_111=109
+dport_map_port_112=110
+dport_map_port_113=111
+dport_map_port_114=112
+dport_map_port_115=113
+dport_map_port_116=114
+dport_map_port_117=115
+dport_map_port_118=116
+dport_map_port_119=117
+dport_map_port_120=118
+dport_map_port_121=119
+dport_map_port_122=120
+dport_map_port_123=121
+dport_map_port_124=122
+dport_map_port_125=123
+dport_map_port_126=124
+dport_map_port_127=125
+dport_map_port_129=126
+dport_map_port_66=127
+dport_map_port_130=128
+
+mmu_init_config="TD3-DEFAULT-LOSSLESS-P3P4"
+sai_preinit_cmd_file=/usr/share/sonic/hwsku/sai_preinit_cmd.soc
+
diff --git a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2
index a29569191651..503c37e9be14 100644
--- a/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2
+++ b/dockers/docker-fpm-frr/frr/bgpd/bgpd.main.conf.j2
@@ -62,7 +62,7 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
{% endblock vlan_advertisement %}
!
!
-{% if DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %}
+{% if DEVICE_METADATA['localhost']['sub_role'] == 'FrontEnd' %}
redistribute connected route-map HIDE_INTERNAL
{% endif %}
!
diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/general/instance.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/general/instance.conf.j2
index 148cfa390e01..aed32d291c76 100644
--- a/dockers/docker-fpm-frr/frr/bgpd/templates/general/instance.conf.j2
+++ b/dockers/docker-fpm-frr/frr/bgpd/templates/general/instance.conf.j2
@@ -15,13 +15,21 @@
!
{% if neighbor_addr | ipv4 %}
address-family ipv4
+{% if 'ASIC' in bgp_session['name'] %}
+ neighbor {{ neighbor_addr }} peer-group PEER_V4_INT
+{% else %}
neighbor {{ neighbor_addr }} peer-group PEER_V4
+{% endif %}
{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %}
neighbor {{ neighbor_addr }} route-map FROM_BGP_PEER_V4_INT in
{% endif %}
{% elif neighbor_addr | ipv6 %}
address-family ipv6
+{% if 'ASIC' in bgp_session['name'] %}
+ neighbor {{ neighbor_addr }} peer-group PEER_V6_INT
+{% else %}
neighbor {{ neighbor_addr }} peer-group PEER_V6
+{% endif %}
{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %}
neighbor {{ neighbor_addr }} route-map FROM_BGP_PEER_V6_INT in
{% endif %}
diff --git a/dockers/docker-fpm-frr/frr/bgpd/templates/general/peer-group.conf.j2 b/dockers/docker-fpm-frr/frr/bgpd/templates/general/peer-group.conf.j2
index 8c02eeacbdb4..b0acd1b2a460 100644
--- a/dockers/docker-fpm-frr/frr/bgpd/templates/general/peer-group.conf.j2
+++ b/dockers/docker-fpm-frr/frr/bgpd/templates/general/peer-group.conf.j2
@@ -2,28 +2,38 @@
! template: bgpd/templates/general/peer-group.conf.j2
!
neighbor PEER_V4 peer-group
+ neighbor PEER_V4_INT peer-group
neighbor PEER_V6 peer-group
+ neighbor PEER_V6_INT peer-group
address-family ipv4
{% if CONFIG_DB__DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %}
neighbor PEER_V4 allowas-in 1
+ neighbor PEER_V4_INT allowas-in 1
{% endif %}
{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %}
- neighbor PEER_V4 route-reflector-client
+ neighbor PEER_V4_INT route-reflector-client
{% endif %}
neighbor PEER_V4 soft-reconfiguration inbound
neighbor PEER_V4 route-map FROM_BGP_PEER_V4 in
neighbor PEER_V4 route-map TO_BGP_PEER_V4 out
+ neighbor PEER_V4_INT soft-reconfiguration inbound
+ neighbor PEER_V4_INT route-map FROM_BGP_PEER_V4 in
+ neighbor PEER_V4_INT route-map TO_BGP_PEER_V4 out
exit-address-family
address-family ipv6
{% if CONFIG_DB__DEVICE_METADATA['localhost']['type'] == 'ToRRouter' %}
neighbor PEER_V6 allowas-in 1
+ neighbor PEER_V6_INT allowas-in 1
{% endif %}
{% if CONFIG_DB__DEVICE_METADATA['localhost']['sub_role'] == 'BackEnd' %}
- neighbor PEER_V6 route-reflector-client
+ neighbor PEER_V6_INT route-reflector-client
{% endif %}
neighbor PEER_V6 soft-reconfiguration inbound
neighbor PEER_V6 route-map FROM_BGP_PEER_V6 in
neighbor PEER_V6 route-map TO_BGP_PEER_V6 out
+ neighbor PEER_V6_INT soft-reconfiguration inbound
+ neighbor PEER_V6_INT route-map FROM_BGP_PEER_V6 in
+ neighbor PEER_V6_INT route-map TO_BGP_PEER_V6 out
exit-address-family
!
! end of template: bgpd/templates/general/peer-group.conf.j2
diff --git a/dockers/docker-lldp-sv2/Dockerfile.j2 b/dockers/docker-lldp-sv2/Dockerfile.j2
index 6a720514ef9b..af2b0373c373 100644
--- a/dockers/docker-lldp-sv2/Dockerfile.j2
+++ b/dockers/docker-lldp-sv2/Dockerfile.j2
@@ -35,12 +35,13 @@ RUN apt-get purge -y python-pip && \
/python-wheels \
~/.cache
+COPY ["docker-lldp-init.sh", "/usr/bin/"]
COPY ["start.sh", "/usr/bin/"]
-COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
+COPY ["supervisord.conf.j2", "/usr/share/sonic/templates/"]
COPY ["lldpd.conf.j2", "/usr/share/sonic/templates/"]
COPY ["lldpd", "/etc/default/"]
COPY ["lldpmgrd", "/usr/bin/"]
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor"]
-ENTRYPOINT ["/usr/bin/supervisord"]
+ENTRYPOINT ["/usr/bin/docker-lldp-init.sh"]
diff --git a/dockers/docker-lldp-sv2/docker-lldp-init.sh b/dockers/docker-lldp-sv2/docker-lldp-init.sh
new file mode 100755
index 000000000000..ae507e8f506a
--- /dev/null
+++ b/dockers/docker-lldp-sv2/docker-lldp-init.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+#Generate supervisord.conf based on device metadata
+mkdir -p /etc/supervisor/conf.d/
+sonic-cfggen -d -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf
+exec /usr/bin/supervisord
diff --git a/dockers/docker-lldp-sv2/supervisord.conf b/dockers/docker-lldp-sv2/supervisord.conf.j2
similarity index 87%
rename from dockers/docker-lldp-sv2/supervisord.conf
rename to dockers/docker-lldp-sv2/supervisord.conf.j2
index 73ff52f4420e..beae3aa9425e 100644
--- a/dockers/docker-lldp-sv2/supervisord.conf
+++ b/dockers/docker-lldp-sv2/supervisord.conf.j2
@@ -31,7 +31,11 @@ stderr_logfile=syslog
# - `-dd` means to stay in foreground, log warnings to console
# - `-ddd` means to stay in foreground, log warnings and info to console
# - `-dddd` means to stay in foreground, log all to console
+{% if DEVICE_METADATA['localhost']['sub_role'] is defined and DEVICE_METADATA['localhost']['sub_role']|length %}
+command=/usr/sbin/lldpd -d -I Ethernet* -C Ethernet*
+{% else %}
command=/usr/sbin/lldpd -d -I Ethernet*,eth0 -C eth0
+{% endif %}
priority=3
autostart=false
autorestart=false
diff --git a/files/build_templates/lldp.service.j2 b/files/build_templates/lldp.service.j2
new file mode 120000
index 000000000000..1adb318b9154
--- /dev/null
+++ b/files/build_templates/lldp.service.j2
@@ -0,0 +1 @@
+per_namespace/lldp.service.j2
\ No newline at end of file
diff --git a/files/image_config/config-setup/config-setup b/files/image_config/config-setup/config-setup
index afff97806518..1f95a10bb053 100755
--- a/files/image_config/config-setup/config-setup
+++ b/files/image_config/config-setup/config-setup
@@ -26,7 +26,11 @@
# Initialize constants
UPDATEGRAPH_CONF=/etc/sonic/updategraph.conf
+INIT_CFG_JSON=/etc/sonic/init_cfg.json
CONFIG_DB_JSON=/etc/sonic/config_db.json
+CONFIG_DB_PATH=/etc/sonic/
+CONFIG_DB_PREFIX=config_db
+CONFIG_DB_SUFFIX=.json
MINGRAPH_FILE=/etc/sonic/minigraph.xml
TMP_ZTP_CONFIG_DB_JSON=/tmp/ztp_config_db.json
FACTORY_DEFAULT_HOOKS=/etc/config-setup/factory-default-hooks.d
@@ -103,24 +107,16 @@ run_hookdir() {
reload_minigraph()
{
echo "Reloading minigraph..."
- if [ ! -f /etc/sonic/init_cfg.json ]; then
- echo "{}" > /etc/sonic/init_cfg.json
- fi
- sonic-db-cli CONFIG_DB FLUSHDB
- sonic-cfggen -H -m -j /etc/sonic/init_cfg.json --write-to-db
- sonic-db-cli CONFIG_DB SET "CONFIG_DB_INITIALIZED" "1"
- if [ -f /etc/sonic/acl.json ]; then
- acl-loader update full /etc/sonic/acl.json
- fi
- config qos reload
- pfcwd start_default
-
- if [[ -x /usr/bin/db_migrator.py ]]; then
- # Set latest version number
- /usr/bin/db_migrator.py -o set_version
- fi
+ config load_minigraph -y -n
+ config save -y
}
+# Reload exisitng config db file on disk
+reload_configdb()
+{
+ echo "Reloading existing config db..."
+ config reload -y -n
+}
# Restore SONiC configuration from a backup copy
function copy_config_files_and_directories()
{
@@ -281,15 +277,49 @@ copy_post_migration_hooks()
fi
}
+# Get the list of config db for both
+# single and multi-npu platforms
+get_config_db_file_list()
+{
+ config_db_file_list=${CONFIG_DB_PREFIX}${CONFIG_DB_SUFFIX}
+ asic_num=0
+ while [[ ($asic_num -lt $NUM_ASIC) && ($NUM_ASIC -gt 1) ]]; do
+ config_db_file_list+=' '${CONFIG_DB_PREFIX}$asic_num${CONFIG_DB_SUFFIX}
+ ((asic_num = asic_num + 1))
+ done
+
+ echo $config_db_file_list
+}
+# Check if all needed config db are prsesnt for both
+# single and multi-npu platforms
+check_all_config_db_present()
+{
+ if [[ ! -r ${CONFIG_DB_JSON} ]]; then
+ return 1
+ fi
+ asic_num=0
+ while [[ ($asic_num -lt $NUM_ASIC) && ($NUM_ASIC -gt 1) ]]; do
+ if [[ ! -r ${CONFIG_DB_PATH}${CONFIG_DB_PREFIX}$asic_num${CONFIG_DB_SUFFIX} ]]; then
+ return 1
+ fi
+ ((asic_num = asic_num + 1))
+ done
+
+ return 0
+}
+
# Perform configuration migration from backup copy.
# - This step is performed when a new image is installed and SONiC switch boots into it
do_config_migration()
{
# Identify list of files to migrate
- copy_list="minigraph.xml snmp.yml acl.json config_db.json frr"
+ copy_list="minigraph.xml snmp.yml acl.json frr"
# Migrate all configuration files from old to new
copy_config_files_and_directories $copy_list
+
+ # Migrate all config_db from old to new
+ copy_config_files_and_directories $(get_config_db_file_list)
# Migrate post-migration hooks
copy_post_migration_hooks
@@ -302,19 +332,14 @@ do_config_migration()
disable_updategraph
rm -f /tmp/pending_config_migration
exit 0
- elif [ -r ${CONFIG_DB_JSON} ]; then
+ elif check_all_config_db_present; then
echo "Use config_db.json from old system..."
- sonic-cfggen -j ${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
+ reload_configdb
+ # Disable updategraph
+ disable_updategraph
elif [ -r ${MINGRAPH_FILE} ]; then
echo "Use minigraph.xml from old system..."
reload_minigraph
- sonic-cfggen -d --print-data > ${CONFIG_DB_JSON}
-
# Disable updategraph
disable_updategraph
else
@@ -349,6 +374,14 @@ boot_config()
do_config_migration
fi
+ # For multi-npu platfrom we don't support config initlaiztion. Assumption
+ # is there should be existing minigraph or config_db from previous image
+ # file system to trigger. pending_config_initialization will remain set
+ # for multi-npu platforms if we reach this case.
+ if [[ ($NUM_ASIC -gt 1) ]]; then
+ return 0
+ fi
+
if [ -e /tmp/pending_config_initialization ] || [ -e ${CONFIG_SETUP_INITIALIZATION_FLAG} ]; then
do_config_initialization
fi
@@ -371,6 +404,13 @@ boot_config()
}
### Execution starts here ###
+PLATFORM=`sonic-cfggen -H -v DEVICE_METADATA.localhost.platform`
+# Parse the device specific asic conf file, if it exists
+ASIC_CONF=/usr/share/sonic/device/$PLATFORM/asic.conf
+if [[ -f "$ASIC_CONF" ]]; then
+ source $ASIC_CONF
+fi
+
CMD=$1
# Default command is boot
diff --git a/files/image_config/ntp/ntp-config.sh b/files/image_config/ntp/ntp-config.sh
index 601b7bd421f0..7ab84174dcaa 100755
--- a/files/image_config/ntp/ntp-config.sh
+++ b/files/image_config/ntp/ntp-config.sh
@@ -1,5 +1,37 @@
#!/bin/bash
+ntp_default_file='/etc/default/ntp'
+ntp_temp_file='/tmp/ntp.orig'
+
+reboot_type='cold'
+
+function get_database_reboot_type()
+{
+ SYSTEM_WARM_START=`sonic-db-cli STATE_DB hget "WARM_RESTART_ENABLE_TABLE|system" enable`
+ SYSTEM_FAST_START=`sonic-db-cli STATE_DB get "FAST_REBOOT|system"`
+
+ if [[ x"${SYSTEM_WARM_START}" == x"true" ]]; then
+ reboot_type='warm'
+ elif [[ x"${SYSTEM_FAST_START}" == x"1" ]]; then
+ reboot_type='fast'
+ fi
+}
+
+function modify_ntp_default
+{
+ cp ${ntp_default_file} ${ntp_temp_file}
+ sed -e "$1" ${ntp_temp_file} >${ntp_default_file}
+}
+
sonic-cfggen -d -t /usr/share/sonic/templates/ntp.conf.j2 >/etc/ntp.conf
+get_database_reboot_type
+if [[ x"${reboot_type}" == x"cold" ]]; then
+ echo "Enabling NTP long jump for reboot type ${reboot_type} ..."
+ modify_ntp_default "s/NTPD_OPTS='-x'/NTPD_OPTS='-g'/"
+else
+ echo "Disabling NTP long jump for reboot type ${reboot_type} ..."
+ modify_ntp_default "s/NTPD_OPTS='-g'/NTPD_OPTS='-x'/"
+fi
+
systemctl restart ntp
diff --git a/files/image_config/updategraph/updategraph b/files/image_config/updategraph/updategraph
index a24d452b1ad2..86ee8a800ae1 100755
--- a/files/image_config/updategraph/updategraph
+++ b/files/image_config/updategraph/updategraph
@@ -3,25 +3,8 @@
reload_minigraph()
{
echo "Reloading minigraph..."
- if [ ! -f /etc/sonic/init_cfg.json ]; then
- echo "{}" > /etc/sonic/init_cfg.json
- fi
- sonic-db-cli CONFIG_DB FLUSHDB
- sonic-cfggen -H -m -j /etc/sonic/init_cfg.json --write-to-db
- sonic-db-cli CONFIG_DB SET "CONFIG_DB_INITIALIZED" "1"
- if [ -f /etc/sonic/acl.json ]; then
- acl-loader update full /etc/sonic/acl.json
- fi
- config qos reload
- DEVICE_TYPE=`sonic-cfggen -m -v DEVICE_METADATA.localhost.type`
- if [ "${DEVICE_TYPE}" != "MgmtToRRouter" ]; then
- pfcwd start_default
- fi
-
- if [[ -x /usr/bin/db_migrator.py ]]; then
- # Set latest version number
- /usr/bin/db_migrator.py -o set_version
- fi
+ config load_minigraph -y -n
+ config save -y
}
if [ ! -f /etc/sonic/updategraph.conf ]; then
@@ -141,7 +124,6 @@ else
fi
reload_minigraph
-sonic-cfggen -d --print-data > /etc/sonic/config_db.json
# Mark as disabled after graph is successfully downloaded
sed -i "/enabled=/d" /etc/sonic/updategraph.conf
diff --git a/platform/barefoot/bfn-platform.mk b/platform/barefoot/bfn-platform.mk
index 1abbedffd6c6..d2bc97d1496c 100644
--- a/platform/barefoot/bfn-platform.mk
+++ b/platform/barefoot/bfn-platform.mk
@@ -1,4 +1,4 @@
-BFN_PLATFORM = bfnplatform_20200407_deb9.deb
+BFN_PLATFORM = bfnplatform_20200507_deb9.deb
$(BFN_PLATFORM)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/dev/$(BFN_PLATFORM)"
SONIC_ONLINE_DEBS += $(BFN_PLATFORM)
diff --git a/platform/barefoot/bfn-sai.mk b/platform/barefoot/bfn-sai.mk
index b58cce6fcf47..d899779025df 100644
--- a/platform/barefoot/bfn-sai.mk
+++ b/platform/barefoot/bfn-sai.mk
@@ -1,4 +1,4 @@
-BFN_SAI = bfnsdk_20200407_deb9.deb
+BFN_SAI = bfnsdk_20200507_deb9.deb
$(BFN_SAI)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/dev/$(BFN_SAI)"
$(BFN_SAI)_DEPENDS += $(LIBNL_GENL3_DEV)
diff --git a/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/s6000_platform.sh b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/s6000_platform.sh
index bf6c730425e7..98fb13b1522f 100755
--- a/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/s6000_platform.sh
+++ b/platform/broadcom/sonic-platform-modules-dell/s6000/scripts/s6000_platform.sh
@@ -60,6 +60,20 @@ remove_i2c_devices() {
done
}
+# Enable/Disable low power mode on all QSFP ports
+switch_board_qsfp_lpmode() {
+ case $1 in
+ "enable") value=0xffff
+ ;;
+ "disable") value=0x0
+ ;;
+ *) echo "s6000_platform: switch_board_qsfp_lpmode: invalid command $1!"
+ return
+ ;;
+ esac
+ echo $value > /sys/bus/platform/devices/dell-s6000-cpld.0/qsfp_lpmode
+}
+
install_python_api_package() {
device="/usr/share/sonic/device"
platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform)
@@ -86,6 +100,7 @@ if [[ "$1" == "init" ]]; then
add_i2c_devices
/usr/local/bin/set-fan-speed 15000
+ switch_board_qsfp_lpmode "disable"
/usr/local/bin/reset-qsfp
elif [[ "$1" == "deinit" ]]; then
remove_i2c_devices
diff --git a/rules/frr.mk b/rules/frr.mk
index 6dc25b30dfff..df924c8af711 100644
--- a/rules/frr.mk
+++ b/rules/frr.mk
@@ -3,8 +3,8 @@
FRR_VERSION = 7.2.1
FRR_SUBVERSION = 0
FRR_BRANCH = frr/7.2
-FRR_TAG = frr-7.2.1-s2
-export FRR_VERSION FRR_SUBVERSION FRR_BRANCH
+FRR_TAG = frr-7.2.1-s3
+export FRR_VERSION FRR_SUBVERSION FRR_BRANCH FRR_TAG
FRR = frr_$(FRR_VERSION)-sonic-$(FRR_SUBVERSION)_$(CONFIGURED_ARCH).deb
diff --git a/sonic-slave-jessie/Dockerfile.j2 b/sonic-slave-jessie/Dockerfile.j2
index dce30193420c..23186d175620 100644
--- a/sonic-slave-jessie/Dockerfile.j2
+++ b/sonic-slave-jessie/Dockerfile.j2
@@ -276,7 +276,7 @@ RUN apt-get update && apt-get install -y \
RUN apt-get -y build-dep linux
# For gobgp and telemetry build
-RUN export VERSION=1.11.5 \
+RUN export VERSION=1.14.2 \
{%- if CONFIGURED_ARCH == "armhf" %}
&& wget https://storage.googleapis.com/golang/go$VERSION.linux-armv6l.tar.gz \
&& tar -C /usr/local -xzf go$VERSION.linux-armv6l.tar.gz \
diff --git a/sonic-slave-stretch/Dockerfile.j2 b/sonic-slave-stretch/Dockerfile.j2
index f9e96791464d..a3936539bc77 100644
--- a/sonic-slave-stretch/Dockerfile.j2
+++ b/sonic-slave-stretch/Dockerfile.j2
@@ -315,7 +315,7 @@ RUN apt-get -t stretch-backports install -y debhelper
RUN apt-get -y build-dep linux
# For gobgp and telemetry build
-RUN export VERSION=1.11.5 \
+RUN export VERSION=1.14.2 \
{%- if CONFIGURED_ARCH == "armhf" %}
&& wget https://storage.googleapis.com/golang/go$VERSION.linux-armv6l.tar.gz \
&& tar -C /usr/local -xzf go$VERSION.linux-armv6l.tar.gz \
@@ -420,8 +420,8 @@ RUN add-apt-repository \
stable"
RUN apt-get update
{%- if CONFIGURED_ARCH == "amd64" %}
-RUN apt-get install -y docker-ce=5:18.09.5~3-0~debian-stretch
+RUN apt-get install -y docker-ce=5:18.09.5~3-0~debian-stretch docker-ce-cli=5:18.09.5~3-0~debian-stretch
{%- else %}
-RUN apt-get install -y docker-ce=18.06.3~ce~3-0~debian
+RUN apt-get install -y docker-ce=18.06.3~ce~3-0~debian docker-ce-cli=18.06.3~ce~3-0~debian
{%- endif %}
RUN echo "DOCKER_OPTS=\"--experimental --storage-driver=vfs\"" >> /etc/default/docker
diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py
index c81258bee531..94ac39dbabde 100644
--- a/src/sonic-config-engine/minigraph.py
+++ b/src/sonic-config-engine/minigraph.py
@@ -35,7 +35,11 @@
VLAN_SUB_INTERFACE_SEPARATOR = '.'
VLAN_SUB_INTERFACE_VLAN_ID = '10'
-# Default Virtual Network Index (VNI)
+FRONTEND_ASIC_SUB_ROLE = 'FrontEnd'
+BACKEND_ASIC_SUB_ROLE = 'BackEnd'
+BACKEND_ASIC_INTERFACE_NAME_PREFIX = 'Ethernet-BP'
+
+# Default Virtual Network Index (VNI)
vni_default = 8000
###############################################################################
@@ -248,14 +252,24 @@ def parse_asic_png(png, asic_name, hostname):
return (neighbors, devices, port_speeds)
def parse_dpg(dpg, hname):
+ aclintfs = None
+ mgmtintfs = None
for child in dpg:
- """In Multi-NPU platforms the acl intfs are defined only for the host not for individual asic.
+ """
+ In Multi-NPU platforms the acl intfs are defined only for the host not for individual asic.
There is just one aclintf node in the minigraph
- Get the aclintfs node first.
+ Get the aclintfs node first.
"""
- if child.find(str(QName(ns, "AclInterfaces"))) is not None:
+ if aclintfs is None and child.find(str(QName(ns, "AclInterfaces"))) is not None:
aclintfs = child.find(str(QName(ns, "AclInterfaces")))
-
+ """
+ In Multi-NPU platforms the mgmt intfs are defined only for the host not for individual asic
+ There is just one mgmtintf node in the minigraph
+ Get the mgmtintfs node first. We need mgmt intf to get mgmt ip in per asic dockers.
+ """
+ if mgmtintfs is None and child.find(str(QName(ns, "ManagementIPInterfaces"))) is not None:
+ mgmtintfs = child.find(str(QName(ns, "ManagementIPInterfaces")))
+
hostname = child.find(str(QName(ns, "Hostname")))
if hostname.text.lower() != hname.lower():
continue
@@ -291,7 +305,6 @@ def parse_dpg(dpg, hname):
mvrf_en_flag = mv.find(str(QName(ns, "mgmtVrfEnabled"))).text
mvrf["vrf_global"] = {"mgmtVrfEnabled": mvrf_en_flag}
- mgmtintfs = child.find(str(QName(ns, "ManagementIPInterfaces")))
mgmt_intf = {}
for mgmtintf in mgmtintfs.findall(str(QName(ns1, "ManagementIPInterface"))):
intfname = mgmtintf.find(str(QName(ns, "AttachTo"))).text
@@ -380,8 +393,8 @@ def parse_dpg(dpg, hname):
# Give a warning if trying to attach ACL to a LAG member interface, correct way is to attach ACL to the LAG interface
if port_alias_map[member] in intfs_inpc:
print >> sys.stderr, "Warning: ACL " + aclname + " is attached to a LAG member interface " + port_alias_map[member] + ", instead of LAG interface"
- elif member.lower().startswith('erspan'):
- if member.lower().startswith('erspanv6'):
+ elif member.lower().startswith('erspan') or member.lower().startswith('egress_erspan'):
+ if member.lower().startswith('erspanv6') or member.lower().startswith('egress_erspanv6'):
is_mirror_v6 = True
else:
is_mirror = True
@@ -392,7 +405,9 @@ def parse_dpg(dpg, hname):
# later after the rest of the minigraph has been parsed.
acl_intfs = pc_intfs[:]
for panel_port in port_alias_map.values():
- if panel_port not in intfs_inpc:
+ # because of port_alias_asic_map we can have duplicate in port_alias_map
+ # so check if already present do not add
+ if panel_port not in intfs_inpc and panel_port not in acl_intfs:
acl_intfs.append(panel_port)
break
if acl_intfs:
@@ -539,6 +554,39 @@ def parse_meta(meta, hname):
region = value
return syslog_servers, dhcp_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region
+
+def parse_linkmeta(meta, hname):
+ link = meta.find(str(QName(ns, "Link")))
+ linkmetas = {}
+ for linkmeta in link.findall(str(QName(ns1, "LinkMetadata"))):
+ port = None
+ fec_disabled = None
+
+ # Sample: ARISTA05T1:Ethernet1/33;switch-t0:fortyGigE0/4
+ key = linkmeta.find(str(QName(ns1, "Key"))).text
+ endpoints = key.split(';')
+ for endpoint in endpoints:
+ t = endpoint.split(':')
+ if len(t) == 2 and t[0].lower() == hname.lower():
+ port = t[1]
+ break
+ else:
+ # Cannot find a matching hname, something went wrong
+ continue
+
+ properties = linkmeta.find(str(QName(ns1, "Properties")))
+ for device_property in properties.findall(str(QName(ns1, "DeviceProperty"))):
+ name = device_property.find(str(QName(ns1, "Name"))).text
+ value = device_property.find(str(QName(ns1, "Value"))).text
+ if name == "FECDisabled":
+ fec_disabled = value
+
+ linkmetas[port] = {}
+ if fec_disabled:
+ linkmetas[port]["FECDisabled"] = fec_disabled
+ return linkmetas
+
+
def parse_asic_meta(meta, hname):
sub_role = None
device_metas = meta.find(str(QName(ns, "Devices")))
@@ -645,27 +693,76 @@ def parse_spine_chassis_fe(results, vni, lo_intfs, phyport_intfs, pc_intfs, pc_m
#
###############################################################################
-def filter_acl_mirror_table_bindings(acls, neighbors, port_channels):
- """
- Filters out inactive front-panel ports from the binding list for mirror
- ACL tables. We define an "active" port as one that is a member of a
- port channel or one that is connected to a neighboring device.
- """
+def filter_acl_table_bindings(acls, neighbors, port_channels, sub_role):
+ filter_acls = {}
+
+ # If the asic role is BackEnd no ACL Table (Ctrl/Data/Everflow) is binded.
+ # This will be applicable in Multi-NPU Platforms.
+
+ if sub_role == BACKEND_ASIC_SUB_ROLE:
+ return filter_acls
+
+ front_port_channel_intf = []
+
+ # Get the front panel port channel. It will use port_alias_asic_map
+ # which will get populated from port_config.ini for Multi-NPU
+ # architecture
+ for port_channel_intf in port_channels:
+ backend_port_channel = any(lag_member in port_alias_asic_map \
+ and lag_member.startswith(BACKEND_ASIC_INTERFACE_NAME_PREFIX) \
+ for lag_member in port_channels[port_channel_intf]['members'])
+ if not backend_port_channel:
+ front_port_channel_intf.append(port_channel_intf)
for acl_table, group_params in acls.iteritems():
group_type = group_params.get('type', None)
+ filter_acls[acl_table] = acls[acl_table]
+ # For Control Plane and Data ACL no filtering is needed
+ # Control Plane ACL has no Interface associated and
+ # Data Plane ACL Interface are attached via minigraph
+ # AclInterface.
if group_type != 'MIRROR' and group_type != 'MIRRORV6':
continue
- active_ports = [ port for port in group_params.get('ports', []) if port in neighbors.keys() or port in port_channels ]
-
+ # Filters out back-panel ports from the binding list for Everflow (Mirror)
+ # ACL tables. We define an "back-panel" port as one that is a member of a
+ # port channel connected to back asic or directly connected to back asic.
+ # This will be applicable in Multi-NPU Platforms.
+ front_panel_ports = []
+ for port in group_params.get('ports', []):
+ if port in port_alias_asic_map and port.startswith(BACKEND_ASIC_INTERFACE_NAME_PREFIX):
+ continue
+ if port in port_channels and port not in front_port_channel_intf:
+ continue
+ front_panel_ports.append(port)
+
+ # Filters out inactive front-panel ports from the binding list for mirror
+ # ACL tables. We define an "active" port as one that is a member of a
+ # front pannel port channel or one that is connected to a neighboring device via front panel port.
+ active_ports = [port for port in front_panel_ports if port in neighbors.keys() or port in front_port_channel_intf]
+
if not active_ports:
print >> sys.stderr, 'Warning: mirror table {} in ACL_TABLE does not have any ports bound to it'.format(acl_table)
- acls[acl_table]['ports'] = active_ports
+ filter_acls[acl_table]['ports'] = active_ports
- return acls
+ return filter_acls
+
+def enable_internal_bgp_session(bgp_sessions, filename, asic_name):
+ '''
+ In Multi-NPU session the internal sessions will always be up.
+ So adding the admin-status 'up' configuration to bgp sessions
+ BGP session between FrontEnd and BackEnd Asics are internal bgp sessions
+ '''
+ local_sub_role = parse_asic_sub_role(filename, asic_name)
+
+ for peer_ip in bgp_sessions.keys():
+ peer_name = bgp_sessions[peer_ip]['name']
+ peer_sub_role = parse_asic_sub_role(filename, peer_name)
+ if ((local_sub_role == FRONTEND_ASIC_SUB_ROLE and peer_sub_role == BACKEND_ASIC_SUB_ROLE) or
+ (local_sub_role == BACKEND_ASIC_SUB_ROLE and peer_sub_role == FRONTEND_ASIC_SUB_ROLE)):
+ bgp_sessions[peer_ip].update({'admin_status': 'up'})
###############################################################################
#
@@ -683,7 +780,6 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
generate asic specific configuration.
"""
root = ET.parse(filename).getroot()
- mini_graph_path = filename
u_neighbors = None
u_devices = None
@@ -717,8 +813,9 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
deployment_id = None
region = None
hostname = None
+ linkmetas = {}
- #hostname is the asic_name, get the asic_id from the asic_name
+ # hostname is the asic_name, get the asic_id from the asic_name
if asic_name is not None:
asic_id = get_npu_id_from_name(asic_name)
else:
@@ -751,6 +848,8 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
(u_neighbors, u_devices, _, _, _, _, _, _) = parse_png(child, hostname)
elif child.tag == str(QName(ns, "MetadataDeclaration")):
(syslog_servers, dhcp_servers, ntp_servers, tacacs_servers, mgmt_routes, erspan_dst, deployment_id, region) = parse_meta(child, hostname)
+ elif child.tag == str(QName(ns, "LinkMetadataDeclaration")):
+ linkmetas = parse_linkmeta(child, hostname)
elif child.tag == str(QName(ns, "DeviceInfos")):
(port_speeds_default, port_descriptions) = parse_deviceinfo(child, hwsku)
else:
@@ -758,19 +857,22 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
(intfs, lo_intfs, mvrf, mgmt_intf, vlans, vlan_members, pcs, pc_members, acls, vni) = parse_dpg(child, asic_name)
elif child.tag == str(QName(ns, "CpgDec")):
(bgp_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, asic_name)
+ enable_internal_bgp_session(bgp_sessions, filename, asic_name)
elif child.tag == str(QName(ns, "PngDec")):
(neighbors, devices, port_speed_png) = parse_asic_png(child, asic_name, hostname)
elif child.tag == str(QName(ns, "MetadataDeclaration")):
(sub_role) = parse_asic_meta(child, asic_name)
+ elif child.tag == str(QName(ns, "LinkMetadataDeclaration")):
+ linkmetas = parse_linkmeta(child, hostname)
elif child.tag == str(QName(ns, "DeviceInfos")):
(port_speeds_default, port_descriptions) = parse_deviceinfo(child, hwsku)
+ # set the host device type in asic metadata also
+ device_type = [devices[key]['type'] for key in devices if key.lower() == hostname.lower()][0]
if asic_name is None:
current_device = [devices[key] for key in devices if key.lower() == hostname.lower()][0]
- name = hostname
else:
current_device = [devices[key] for key in devices if key.lower() == asic_name.lower()][0]
- name = asic_name
results = {}
results['DEVICE_METADATA'] = {'localhost': {
@@ -778,9 +880,9 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
'deployment_id': deployment_id,
'region': region,
'docker_routing_config_mode': docker_routing_config_mode,
- 'hostname': name,
+ 'hostname': hostname,
'hwsku': hwsku,
- 'type': current_device['type']
+ 'type': device_type
}
}
# for this hostname, if sub_role is defined, add sub_role in
@@ -788,6 +890,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
if sub_role is not None:
current_device['sub_role'] = sub_role
results['DEVICE_METADATA']['localhost']['sub_role'] = sub_role
+ results['DEVICE_METADATA']['localhost']['asic_name'] = asic_name
results['BGP_NEIGHBOR'] = bgp_sessions
results['BGP_MONITORS'] = bgp_monitors
results['BGP_PEER_RANGE'] = bgp_peers_with_range
@@ -848,7 +951,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
for port_name in port_speed_png:
# not consider port not in port_config.ini
- #If no port_config_file is found ports is empty so ignore this error
+ # If no port_config_file is found ports is empty so ignore this error
if port_config_file is not None:
if port_name not in ports:
print >> sys.stderr, "Warning: ignore interface '%s' as it is not in the port_config.ini" % port_name
@@ -857,7 +960,14 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
ports.setdefault(port_name, {})['speed'] = port_speed_png[port_name]
for port_name, port in ports.items():
- if port.get('speed') == '100000':
+ # get port alias from port_config.ini
+ if port_config_file:
+ alias = port.get('alias')
+ else:
+ alias = port_name
+ # generate default 100G FEC
+ # Note: FECDisabled only be effective on 100G port right now
+ if port.get('speed') == '100000' and linkmetas.get(alias, {}).get('FECDisabled', '').lower() != 'true':
port['fec'] = 'rs'
# set port description if parsed from deviceinfo
@@ -968,7 +1078,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None):
results['DHCP_SERVER'] = dict((item, {}) for item in dhcp_servers)
results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers)
results['TACPLUS_SERVER'] = dict((item, {'priority': '1', 'tcp_port': '49'}) for item in tacacs_servers)
- results['ACL_TABLE'] = filter_acl_mirror_table_bindings(acls, neighbors, pcs)
+ results['ACL_TABLE'] = filter_acl_table_bindings(acls, neighbors, pcs, sub_role)
results['FEATURE'] = {
'telemetry': {
'status': 'enabled'
diff --git a/src/sonic-config-engine/sonic_device_util.py b/src/sonic-config-engine/sonic_device_util.py
index 994eeb8ae395..cf1edfd59bfb 100644
--- a/src/sonic-config-engine/sonic_device_util.py
+++ b/src/sonic-config-engine/sonic_device_util.py
@@ -5,6 +5,8 @@
import re
from natsort import natsorted
import glob
+from swsssdk import ConfigDBConnector, SonicDBConfig
+
DOCUMENTATION = '''
---
module: sonic_device_util
@@ -21,6 +23,9 @@
SONIC_DEVICE_PATH = '/usr/share/sonic/device'
NPU_NAME_PREFIX = 'asic'
NAMESPACE_PATH_GLOB = '/run/netns/*'
+ASIC_CONF_FILENAME = 'asic.conf'
+FRONTEND_ASIC_SUB_ROLE = 'FrontEnd'
+BACKEND_ASIC_SUB_ROLE = 'BackEnd'
def get_machine_info():
if not os.path.isfile('/host/machine.conf'):
return None
@@ -41,7 +46,9 @@ def get_npu_id_from_name(npu_name):
def get_num_npus():
platform = get_platform_info(get_machine_info())
- asic_conf_file_path = os.path.join(SONIC_DEVICE_PATH, platform, 'asic.conf')
+ if not platform:
+ return 1
+ asic_conf_file_path = os.path.join(SONIC_DEVICE_PATH, platform, ASIC_CONF_FILENAME)
if not os.path.isfile(asic_conf_file_path):
return 1
with open(asic_conf_file_path) as asic_conf_file:
@@ -51,7 +58,7 @@ def get_num_npus():
continue
if tokens[0].lower() == 'num_asic':
num_npus = tokens[1].strip()
- return num_npus
+ return int(num_npus)
def get_namespaces():
"""
@@ -64,6 +71,52 @@ def get_namespaces():
ns_list.append(ns)
return natsorted(ns_list)
+def get_hwsku():
+ config_db = ConfigDBConnector()
+ config_db.connect()
+ metadata = config_db.get_table('DEVICE_METADATA')
+ return metadata['localhost']['hwsku']
+
+def get_platform():
+ if not os.path.isfile('/host/machine.conf'):
+ return ''
+
+ with open('/host/machine.conf') as machine_conf:
+ for line in machine_conf:
+ tokens = line.split('=')
+ if tokens[0].strip() == 'onie_platform' or tokens[0].strip() == 'aboot_platform':
+ return tokens[1].strip()
+ return ''
+
+def is_multi_npu():
+ num_npus = get_num_npus()
+ return (num_npus > 1)
+
+def get_all_namespaces():
+ """
+ In case of Multi-Asic platform, Each ASIC will have a linux network namespace created.
+ So we loop through the databases in different namespaces and depending on the sub_role
+ decide whether this is a front end ASIC/namespace or a back end one.
+ """
+ front_ns = []
+ back_ns = []
+ num_npus = get_num_npus()
+ SonicDBConfig.load_sonic_global_db_config()
+
+ if is_multi_npu():
+ for npu in range(num_npus):
+ namespace = "{}{}".format(NPU_NAME_PREFIX, npu)
+ config_db = ConfigDBConnector(use_unix_socket_path=True, namespace=namespace)
+ config_db.connect()
+
+ metadata = config_db.get_table('DEVICE_METADATA')
+ if metadata['localhost']['sub_role'] == FRONTEND_ASIC_SUB_ROLE:
+ front_ns.append(namespace)
+ elif metadata['localhost']['sub_role'] == BACKEND_ASIC_SUB_ROLE:
+ back_ns.append(namespace)
+
+ return {'front_ns':front_ns, 'back_ns':back_ns}
+
def get_platform_info(machine_info):
if machine_info != None:
if machine_info.has_key('onie_platform'):
diff --git a/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml b/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml
index 118202d9b52e..8ca17925c6ec 100644
--- a/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml
+++ b/src/sonic-config-engine/tests/multi_npu_data/sample-minigraph.xml
@@ -650,14 +650,14 @@
05T2
Ethernet1
multi_npu_platform_01
- Ethernet1/8
+ Ethernet1/5
DeviceInterfaceLink
05T2
Ethernet2
multi_npu_platform_01
- Ethernet1/9
+ Ethernet1/6
DeviceInterfaceLink
diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml
index 47985f870e50..5e4a68db0e87 100644
--- a/src/sonic-config-engine/tests/t0-sample-graph.xml
+++ b/src/sonic-config-engine/tests/t0-sample-graph.xml
@@ -303,6 +303,11 @@
everflowV6
Everflow
+
+ EGRESS_ERSPAN
+ everflow_egress
+ Everflow
+
PortChannel01;PortChannel02;PortChannel03;PortChannel04
DataAclIngress
@@ -376,13 +381,14 @@
Ethernet1/1
switch-t0
fortyGigE0/124
+ 100000
DeviceInterfaceLink
true
- 10000
+ 100000
switch-t0
- fortyGigE0/2
+ fortyGigE0/4
true
ARISTA05T1
Ethernet1/33
@@ -434,6 +440,32 @@
+
+
+
+
+
+
+ FECDisabled
+
+ True
+
+
+ ARISTA05T1:Ethernet1/33;switch-t0:fortyGigE0/4
+
+
+
+
+
+ FECDisabled
+
+ True
+
+
+ ARISTA06T1:Ethernet1/34;switch-t0:fortyGigE0/8
+
+
+
switch-t0
Force10-S6000
diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py
index 07769e0bf613..816575f84171 100644
--- a/src/sonic-config-engine/tests/test_cfggen.py
+++ b/src/sonic-config-engine/tests/test_cfggen.py
@@ -107,10 +107,9 @@ def test_minigraph_acl(self):
argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v ACL_TABLE'
output = self.run_script(argument, True)
self.assertEqual(output.strip(), "Warning: Ignoring Control Plane ACL NTP_ACL without type\n"
- "Warning: ignore interface 'fortyGigE0/2' as it is not in the port_config.ini\n"
- "Warning: ignore interface 'fortyGigE0/2' in DEVICE_NEIGHBOR as it is not in the port_config.ini\n"
"{'NTP_ACL': {'services': ['NTP'], 'type': 'CTRLPLANE', 'policy_desc': 'NTP_ACL', 'stage': 'ingress'}, "
"'EVERFLOW': {'stage': 'ingress', 'type': 'MIRROR', 'ports': ['PortChannel01', 'PortChannel02', 'PortChannel03', 'PortChannel04', 'Ethernet4'], 'policy_desc': 'EVERFLOW'}, "
+ "'EVERFLOW_EGRESS': {'stage': 'egress', 'type': 'MIRROR', 'ports': ['PortChannel01', 'PortChannel02', 'PortChannel03', 'PortChannel04', 'Ethernet4'], 'policy_desc': 'EVERFLOW_EGRESS'}, "
"'ROUTER_PROTECT': {'services': ['SSH', 'SNMP'], 'type': 'CTRLPLANE', 'policy_desc': 'ROUTER_PROTECT', 'stage': 'ingress'}, "
"'DATAACLINGRESS': {'stage': 'ingress', 'type': 'L3', 'ports': ['PortChannel01', 'PortChannel02', 'PortChannel03', 'PortChannel04'], 'policy_desc': 'DATAACLINGRESS'}, "
"'SNMP_ACL': {'services': ['SNMP'], 'type': 'CTRLPLANE', 'policy_desc': 'SNMP_ACL', 'stage': 'ingress'}, "
@@ -190,7 +189,18 @@ def test_minigraph_extra_neighbors(self):
def test_minigraph_port_description(self):
argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v "PORT[\'Ethernet124\']"'
output = self.run_script(argument)
- self.assertEqual(output.strip(), "{'lanes': '101,102,103,104', 'description': 'ARISTA04T1:Ethernet1/1', 'pfc_asym': 'off', 'mtu': '9100', 'alias': 'fortyGigE0/124', 'admin_status': 'up'}")
+ self.assertEqual(output.strip(), "{'lanes': '101,102,103,104', 'fec': 'rs', 'pfc_asym': 'off', 'mtu': '9100', 'alias': 'fortyGigE0/124', 'admin_status': 'up', 'speed': '100000', 'description': 'ARISTA04T1:Ethernet1/1'}")
+
+ def test_minigraph_port_fec_disabled(self):
+ # Test for FECDisabled
+ argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v "PORT[\'Ethernet4\']"'
+ output = self.run_script(argument)
+ self.assertEqual(output.strip(), "{'lanes': '25,26,27,28', 'description': 'Servers0:eth0', 'pfc_asym': 'off', 'mtu': '9100', 'alias': 'fortyGigE0/4', 'admin_status': 'up', 'speed': '100000'}")
+
+ def test_minigraph_port_rs(self):
+ argument = '-m "' + self.sample_graph_t0 + '" -p "' + self.port_config + '" -v "PORT[\'Ethernet124\']"'
+ output = self.run_script(argument)
+ self.assertEqual(output.strip(), "{'lanes': '101,102,103,104', 'fec': 'rs', 'pfc_asym': 'off', 'mtu': '9100', 'alias': 'fortyGigE0/124', 'admin_status': 'up', 'speed': '100000', 'description': 'ARISTA04T1:Ethernet1/1'}")
def test_minigraph_bgp(self):
argument = '-m "' + self.sample_graph_bgp_speaker + '" -p "' + self.port_config + '" -v "BGP_NEIGHBOR[\'10.0.0.59\']"'
diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py
index 6facae0451db..c3307b482b79 100644
--- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py
+++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py
@@ -9,7 +9,7 @@
ASIC_SKU = 'multi-npu-asic'
NUM_ASIC = 4
HOSTNAME = 'multi_npu_platform_01'
-
+DEVICE_TYPE = 'LeafRouter'
class TestMultiNpuCfgGen(TestCase):
@@ -116,7 +116,7 @@ def test_mgmt_port(self):
self.assertDictEqual(output, {'eth0': {'alias': 'eth0', 'admin_status': 'up'}})
for asic in range(NUM_ASIC):
output = json.loads(self.run_script_for_asic(argument, asic, self.port_config[asic]))
- self.assertDictEqual(output, {})
+ self.assertDictEqual(output, {'eth0': {'alias': 'eth0', 'admin_status': 'up'}})
def test_frontend_asic_portchannels(self):
argument = "-m {} -p {} -n asic0 --var-json \"PORTCHANNEL\"".format(self.sample_graph, self.port_config[0])
@@ -197,25 +197,51 @@ def test_frontend_bgp_neighbor(self):
output = json.loads(self.run_script(argument))
self.assertDictEqual(output, \
{'10.0.0.1': {'rrclient': 0, 'name': '01T2', 'local_addr': '10.0.0.0', 'nhopself': 0, 'holdtime': '10', 'asn': '65200', 'keepalive': '3'},
- '10.1.0.0': {'rrclient': 0, 'name': 'ASIC2', 'local_addr': '10.1.0.1', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0'},
+ '10.1.0.0': {'rrclient': 0, 'name': 'ASIC2', 'local_addr': '10.1.0.1', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0', 'admin_status': 'up'},
'fc00::2': {'rrclient': 0, 'name': '01T2', 'local_addr': 'fc00::1', 'nhopself': 0, 'holdtime': '10', 'asn': '65200', 'keepalive': '3'},
- '10.1.0.2': {'rrclient': 0, 'name': 'ASIC3', 'local_addr': '10.1.0.3', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0'}})
+ '10.1.0.2': {'rrclient': 0, 'name': 'ASIC3', 'local_addr': '10.1.0.3', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0', 'admin_status': 'up'}})
def test_backend_asic_bgp_neighbor(self):
argument = "-m {} -p {} -n asic3 --var-json \"BGP_NEIGHBOR\"".format(self.sample_graph, self.port_config[3])
output = json.loads(self.run_script(argument))
self.assertDictEqual(output, \
- {'10.1.0.7': {'rrclient': 0, 'name': 'ASIC1', 'local_addr': '10.1.0.6', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0'},
- '10.1.0.3': {'rrclient': 0, 'name': 'ASIC0', 'local_addr': '10.1.0.2', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0'}})
+ {'10.1.0.7': {'rrclient': 0, 'name': 'ASIC1', 'local_addr': '10.1.0.6', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0', 'admin_status': 'up'},
+ '10.1.0.3': {'rrclient': 0, 'name': 'ASIC0', 'local_addr': '10.1.0.2', 'nhopself': 0, 'holdtime': '0', 'asn': '65100', 'keepalive': '0', 'admin_status': 'up'}})
def test_device_asic_metadata(self):
argument = "-m {} --var-json DEVICE_METADATA".format(self.sample_graph)
for asic in range(NUM_ASIC):
output = json.loads(self.run_script_for_asic(argument, asic,self.port_config[asic]))
asic_name = "asic{}".format(asic)
- self.assertEqual(output['localhost']['hostname'], asic_name)
- self.assertEqual(output['localhost']['type'], 'Asic')
+ self.assertEqual(output['localhost']['hostname'], 'multi_npu_platform_01')
+ self.assertEqual(output['localhost']['asic_name'], asic_name)
+ self.assertEqual(output['localhost']['type'], DEVICE_TYPE)
if asic == 0 or asic == 1:
self.assertEqual(output['localhost']['sub_role'], 'FrontEnd')
else:
self.assertEqual(output['localhost']['sub_role'], 'BackEnd')
+
+ def test_global_asic_acl(self):
+ argument = "-m {} --var-json \"ACL_TABLE\"".format(self.sample_graph)
+ output = json.loads(self.run_script(argument))
+ self.assertDictEqual(output, {\
+ 'DATAACL': {'policy_desc': 'DATAACL', 'ports': ['PortChannel0002','PortChannel0008'], 'stage': 'ingress', 'type': 'L3'},
+ 'EVERFLOW': {'policy_desc': 'EVERFLOW', 'ports': ['PortChannel0002','PortChannel0008'], 'stage': 'ingress', 'type': 'MIRROR'},
+ 'EVERFLOWV6':{'policy_desc': 'EVERFLOWV6', 'ports': ['PortChannel0002','PortChannel0008'], 'stage': 'ingress', 'type': 'MIRRORV6'},
+ 'SNMP_ACL': {'policy_desc': 'SNMP_ACL', 'services': ['SNMP'], 'stage': 'ingress', 'type': 'CTRLPLANE'},
+ 'SSH_ONLY': {'policy_desc': 'SSH_ONLY', 'services': ['SSH'], 'stage': 'ingress', 'type': 'CTRLPLANE'}})
+
+ def test_front_end_asic_acl(self):
+ argument = "-m {} -p {} -n asic0 --var-json \"ACL_TABLE\"".format(self.sample_graph, self.port_config[0])
+ output = json.loads(self.run_script(argument))
+ self.assertDictEqual(output, {\
+ 'DATAACL': {'policy_desc': 'DATAACL', 'ports': ['PortChannel0002'], 'stage': 'ingress', 'type': 'L3'},
+ 'EVERFLOW': {'policy_desc': 'EVERFLOW', 'ports': ['PortChannel0002'], 'stage': 'ingress', 'type': 'MIRROR'},
+ 'EVERFLOWV6':{'policy_desc': 'EVERFLOWV6', 'ports': ['PortChannel0002'], 'stage': 'ingress', 'type': 'MIRRORV6'},
+ 'SNMP_ACL': {'policy_desc': 'SNMP_ACL', 'services': ['SNMP'], 'stage': 'ingress', 'type': 'CTRLPLANE'},
+ 'SSH_ONLY': {'policy_desc': 'SSH_ONLY', 'services': ['SSH'], 'stage': 'ingress', 'type': 'CTRLPLANE'}})
+
+ def test_back_end_asic_acl(self):
+ argument = "-m {} -p {} -n asic3 --var-json \"ACL_TABLE\"".format(self.sample_graph, self.port_config[3])
+ output = json.loads(self.run_script(argument))
+ self.assertDictEqual(output, {})
diff --git a/src/sonic-frr/frr b/src/sonic-frr/frr
index e1b0c939960c..2f3f691f44ea 160000
--- a/src/sonic-frr/frr
+++ b/src/sonic-frr/frr
@@ -1 +1 @@
-Subproject commit e1b0c939960c49eba05e972a68d50ca32dd09303
+Subproject commit 2f3f691f44ea0194a145aed59606fdd0f33ecdb4
diff --git a/src/sonic-restapi b/src/sonic-restapi
index c219e3da28fb..95e6bf8dcbf9 160000
--- a/src/sonic-restapi
+++ b/src/sonic-restapi
@@ -1 +1 @@
-Subproject commit c219e3da28fb20b63b065ceb1828125593d73f14
+Subproject commit 95e6bf8dcbf9a3052c01cb8264f0a750eda91625
diff --git a/src/sonic-swss b/src/sonic-swss
index 2218ed4cc50a..62d4af4f1e0b 160000
--- a/src/sonic-swss
+++ b/src/sonic-swss
@@ -1 +1 @@
-Subproject commit 2218ed4cc50aebba681b42f300869c84c90be613
+Subproject commit 62d4af4f1e0bd4115ba139a215847294c9f3a90a
diff --git a/src/sonic-utilities b/src/sonic-utilities
index 42e4fdc623ad..3d77d5a9c49d 160000
--- a/src/sonic-utilities
+++ b/src/sonic-utilities
@@ -1 +1 @@
-Subproject commit 42e4fdc623adb4be5b1ed6eaa6e8d7763951fbb1
+Subproject commit 3d77d5a9c49d764f9d7c479ec8446a2b8aec4925