diff --git a/files/image_config/interfaces/interfaces.j2 b/files/image_config/interfaces/interfaces.j2
index 71e2d2514fa2..d643d2b1901a 100644
--- a/files/image_config/interfaces/interfaces.j2
+++ b/files/image_config/interfaces/interfaces.j2
@@ -21,7 +21,7 @@ iface lo {{ 'inet' if prefix | ipv4 else 'inet6' }} static
# The management network interface
auto eth0
{% if MGMT_INTERFACE %}
-{% for (name, prefix) in MGMT_INTERFACE %}
+{% for (name, prefix) in MGMT_INTERFACE|sort_by_prefix %}
iface eth0 {{ 'inet' if prefix | ipv4 else 'inet6' }} static
address {{ prefix | ip }}
netmask {{ prefix | netmask if prefix | ipv4 else prefix | prefixlen }}
diff --git a/src/sonic-config-engine/sonic-cfggen b/src/sonic-config-engine/sonic-cfggen
index 2495bc89fe06..96c9d2218aa5 100755
--- a/src/sonic-config-engine/sonic-cfggen
+++ b/src/sonic-config-engine/sonic-cfggen
@@ -33,6 +33,13 @@ from swsssdk import ConfigDBConnector
from collections import OrderedDict
from natsort import natsorted
+# Sort by interface name. For configs to the same interface (name),
+# sort by prefix to put v4 address ahead of v6 address in the list
+def sort_by_prefix(value):
+ if not value:
+ return None
+ return sorted(value.keys(), key = lambda k: (k[0], 4) if is_ipv4(k[1]) else (k[0], 6))
+
def is_ipv4(value):
if not value:
return False
@@ -210,6 +217,7 @@ def main():
loader = jinja2.FileSystemLoader(paths)
env = jinja2.Environment(loader=loader, trim_blocks=True)
+ env.filters['sort_by_prefix'] = sort_by_prefix
env.filters['ipv4'] = is_ipv4
env.filters['ipv6'] = is_ipv6
env.filters['unique_name'] = unique_name
diff --git a/src/sonic-config-engine/tests/sample_output/interfaces b/src/sonic-config-engine/tests/sample_output/interfaces
index c8da2fee8f76..c70a9bd47f60 100644
--- a/src/sonic-config-engine/tests/sample_output/interfaces
+++ b/src/sonic-config-engine/tests/sample_output/interfaces
@@ -30,17 +30,17 @@ iface eth0 inet static
down ip -4 route delete 10.0.0.0/24 dev eth0 table default
down ip -4 rule delete from 10.0.0.100/32 table default
iface eth0 inet6 static
- address 2603:10e2:0:2902::8
+ address 603:10e2:0:2902::8
netmask 64
########## management network policy routing rules
# management port up rules
- up ip -6 route add default via 2603:10e2:0:2902::1 dev eth0 table default
- up ip -6 route add 2603:10e2:0:2902::/64 dev eth0 table default
- up ip -6 rule add from 2603:10e2:0:2902::8/128 table default
+ up ip -6 route add default via 603:10e2:0:2902::1 dev eth0 table default
+ up ip -6 route add 603:10e2:0:2902::/64 dev eth0 table default
+ up ip -6 rule add from 603:10e2:0:2902::8/128 table default
# management port down rules
- down ip -6 route delete default via 2603:10e2:0:2902::1 dev eth0 table default
- down ip -6 route delete 2603:10e2:0:2902::/64 dev eth0 table default
- down ip -6 rule delete from 2603:10e2:0:2902::8/128 table default
+ down ip -6 route delete default via 603:10e2:0:2902::1 dev eth0 table default
+ down ip -6 route delete 603:10e2:0:2902::/64 dev eth0 table default
+ down ip -6 rule delete from 603:10e2:0:2902::8/128 table default
#
# The switch front panel interfaces
# "|| true" is added to suppress the error when interface is already a member of LAG
diff --git a/src/sonic-config-engine/tests/t0-sample-graph.xml b/src/sonic-config-engine/tests/t0-sample-graph.xml
index bda5517771e5..0806d278cc7a 100644
--- a/src/sonic-config-engine/tests/t0-sample-graph.xml
+++ b/src/sonic-config-engine/tests/t0-sample-graph.xml
@@ -167,9 +167,9 @@
HostIP
eth0
- 2603:10e2:0:2902::8/64
+ 603:10e2:0:2902::8/64
- 2603:10e2:0:2902::8/64
+ 603:10e2:0:2902::8/64